PropertyInfo组件

编辑本页

PropertyInfo组件

PropertyInfo组件允许您通过使用不同的元数据源来获得有关类属性的信息。

PropertyAccess组件允许您从对象和数组中读取和写入值,PropertyInfo组件仅与类定义一起工作,以提供关于类中的属性的数据类型和可见性的信息(包括通过getter或setter方法)。

安装

1
作曲家需要symfony/属性信息ob娱乐下载

请注意

如果在Symfony应用程序外部安装此组件,则必须要求ob娱乐下载供应商/ autoload.php文件,以启用Composer提供的类自动加载机制。读这篇文章欲知详情。

类可能需要其他依赖项此组件提供的提取器

使用

要使用此组件,请创建一个newPropertyInfoExtractor实例,并为其提供一组信息提取器:

12 34 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
使用例子名称空间YourAwesomeCoolClass使用ob娱乐下载组件PropertyInfoPhpDocExtractor使用ob娱乐下载组件PropertyInfoReflectionExtractor使用ob娱乐下载组件PropertyInfoPropertyInfoExtractor//提取器的完整列表如下所示phpDocExtractorPhpDocExtractor ();reflectionExtractorReflectionExtractor ();// PropertyListExtractorInterface的列表(任意可迭代)listExtractors= (reflectionExtractor];// PropertyTypeExtractorInterface列表(任意可迭代对象)typeExtractors= (phpDocExtractorreflectionExtractor];// PropertyDescriptionExtractorInterface的列表(任意可迭代对象)descriptionExtractors= (phpDocExtractor];// PropertyAccessExtractorInterface的列表(任意可迭代)accessExtractors= (reflectionExtractor];// PropertyInitializableExtractorInterface的列表propertyInitializableExtractors= (reflectionExtractor];propertyInfoPropertyInfoExtractor (listExtractorstypeExtractorsdescriptionExtractorsaccessExtractorspropertyInitializableExtractors);//更多例子见下面= YourAwesomeCoolClass::类;属性propertyInfo->getproperty ();

器命令

数组中提取器实例的顺序很重要:将返回第一个非空结果。这就是为什么您必须将每个类别的提取器作为一个单独的数组提供,即使一个提取器提供了多个类别的信息。

例如,而ReflectionExtractor而且DoctrineExtractor两者都提供列表和类型信息,最好是:

  • ReflectionExtractor对列表信息具有优先级,以便返回类中的所有属性(不仅仅是映射的属性)。
  • DoctrineExtractor对类型信息具有优先级,因此使用实体元数据而不是类型提示来提供更准确的类型信息:

    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
    使用ob娱乐下载学说PropertyInfoDoctrineExtractor使用ob娱乐下载组件PropertyInfoReflectionExtractor使用ob娱乐下载组件PropertyInfoPropertyInfoExtractorreflectionExtractorReflectionExtractor ();doctrineExtractorDoctrineExtractor (/ *……* /);propertyInfoPropertyInfoExtractor (//列表提取器reflectionExtractordoctrineExtractor),//类型提取器doctrineExtractorreflectionExtractor]);

可推断出的信息

PropertyInfoExtractor类公开了公共方法来提取几种类型的信息:

请注意

一定要通过一个Name,而不是提取器方法的对象:

1 2 3 4 5 6 7
/ /坏!它可能工作,但不是所有的提取器propertyInfo->getproperty (awesomeObject);/ /好!propertyInfo->getproperty (get_class (awesomeObject));propertyInfo->getproperty (的例子\ \ YourAwesomeClass名称空间);propertyInfo->getproperty (YourAwesomeClass::类);

列表信息

实现的提取器PropertyListExtractorInterface以数组形式提供类中可用的属性列表,其中包含每个属性名称为字符串:

1 2 3 4 5 6 7 8 9 10
属性propertyInfo->getproperty ();/ *结果示例  -------------- (3)数组{[0]= >字符串(8)"username" [1] => string(8)"password" [2] => string(6)"active"} */

类型信息

实现的提取器PropertyTypeExtractorInterface提供广泛的数据类型信息对于属性:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
类型propertyInfo->getTypes (财产);/*示例结果-------------- array(1) {[0] => class Symfony\Compoob娱乐下载nent\PropertyInfo\Type (6) {private $builtinType => string(6)"string" private $nullable => bool(false) private $class => NULL private $collection => bool(false) private $collectionKeyType => NULL private $collectionValueType => NULL}} */

看到PropertyInfo组件有关类型类。

描述信息

实现的提取器PropertyDescriptionExtractorInterface将属性注释中的长、短描述作为字符串提供:

12 3 4 5 6 7 8 9 10 11 12 13 14 15
标题propertyInfo->getShortDescription (财产);/*结果示例-------------- string(41)"这是DocComment的第一行。"* /propertyInfo->getLongDescription (财产);-------------- string(79):这是DocComment的后续段落。它可以跨越多行。* /

访问信息

实现的提取器PropertyAccessExtractorInterface提供属性是否可读或可写为布尔值:

1 2 3 4 5
propertyInfo->isReadable (财产);//示例结果:bool(true)propertyInfo->isWritable (财产);//示例结果:bool(false)

ReflectionExtractor查找getter/isser/setter/hasser方法以及属性是否为公共以确定它是否可访问。这是基于PropertyAccess的工作原理。

属性可初始化信息

实现的提取器PropertyInitializableExtractorInterface提供属性是否可通过类的构造函数初始化为布尔值:

1 2
propertyInfo->isInitializable (财产);//示例结果:bool(true)

isInitializable ()返回真正的如果给定类的构造函数形参与给定属性名匹配。

提示

主要的PropertyInfoExtractor类实现了所有接口,将属性信息的提取委托给已注册到它的提取器。

这意味着每个提取器上可用的任何方法在主提取器上也可用PropertyInfoExtractor类。

类型的对象

与其他提取器相比,类型信息提取器提供的信息比可以用简单的标量值表示的信息多得多。因此,类型提取器返回一个数组类型属性支持的每种类型的对象。

例如,如果一个属性同时支持两者整数而且字符串(通过@return int |字符串注释),PropertyInfoExtractor: getTypes ()将返回一个包含两个的实例类型类。

请注意

大多数提取器只返回一个类型实例。的PhpDocExtractor是当前唯一返回数组中多个实例的提取器。

每个对象将提供6个属性,在6个方法中可用:

类型::getBuiltInType ()

类型::getBuiltinType ()方法返回内置的PHP数据类型,它可以是以下字符串值之一:数组保龄球可调用的浮动int可迭代的对象资源字符串

常量。类型类,在形式中类型::BUILTIN_TYPE_ *,为方便起见。

类型::isNullable ()

类型::isNullable ()方法将返回一个布尔值,该值指示是否可以将属性参数设置为

类型::getClassName ()

如果内置PHP数据类型对象,类型::getClassName ()方法将返回可接受的完全限定类或接口名称。

类型::isCollection ()

类型::isCollection ()方法将返回一个布尔值,该值指示属性参数是否为一个集合——一个能够包含其他值的非标量值。目前这个返回真正的如果:

  • 内置PHP数据类型数组
  • 派生该属性的mutator方法的前缀为添加删除(定义为数组突变前缀列表);
  • phpDocumentor注释类型为“collection”(例如:@var SomeClass < DateTime >@var SomeClass <整数,字符串>@var学说\常见\集合收集\ <应用\实体\ SomeEntity >等)。

类型::getCollectionKeyTypes ()类型::getCollectionValueTypes ()

属性为集合时,可以为集合的键类型和值类型(如果信息可用)返回其他类型对象类型::getCollectionKeyTypes ()而且类型::getCollectionValueTypes ()方法。

提取器

属性信息的提取由器类.提取类可以通过实现正确的接口提供一种或多种类型的属性信息。

PropertyInfoExtractor将迭代相关提取器类在他们被设置的顺序,调用适当的方法,并返回第一个结果不是

虽然你可以创建自己的提取器,但下面的提取器已经可以覆盖大多数用例:

ReflectionExtractor

使用PHP反射,ReflectionExtractor提供设置器和访问器方法的列表、类型和访问信息。它还可以给出属性的类型(甚至可以从构造函数参数中提取它),以及它是否可以通过构造函数初始化。它支持PHP 7的返回类型和标量类型:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
使用ob娱乐下载组件PropertyInfoReflectionExtractorreflectionExtractorReflectionExtractor ();//列出信息。reflectionExtractor->getproperty ();//类型信息。reflectionExtractor->getTypes (财产);//访问信息。reflectionExtractor->isReadable (财产);reflectionExtractor->isWritable (财产);//初始化信息reflectionExtractor->isInitializable (财产);

请注意

使用Symfony框架时,当ob娱乐下载property_info启用功能:

1 2 3 4
#配置/包/ framework.yaml框架:property_info:启用:真正的

PhpDocExtractor

请注意

这个提取器依赖于phpdocumentor / reflection-docblock图书馆。

使用phpDocumentor反射要解析属性和方法注释,可以使用PhpDocExtractor提供类型和描述信息。类自动注册此提取器property_info在Symfonob娱乐下载y框架中如果存在依赖库:

1 2 3 4 5 6 7 8 9
使用ob娱乐下载组件PropertyInfoPhpDocExtractorphpDocExtractorPhpDocExtractor ();//类型信息。phpDocExtractor->getTypes (财产);//描述信息。phpDocExtractor->getShortDescription (财产);phpDocExtractor->getLongDescription (财产);

SerializerExtractor

请注意

这个提取器依赖于ob娱乐下载symfony /序列化器图书馆。

使用组元数据序列化器组件,SerializerExtractor提供列表信息。这个提取器是自动注册到property_infoSymfony框架中的服务:ob娱乐下载

12 3 4 5 6 7 8 9 10 11 12
使用学说常见的注释AnnotationReader使用ob娱乐下载组件PropertyInfoSerializerExtractor使用ob娱乐下载组件序列化器映射工厂ClassMetadataFactory使用ob娱乐下载组件序列化器映射加载程序AnnotationLoaderserializerClassMetadataFactoryClassMetadataFactory (AnnotationLoader (AnnotationReader));serializerExtractorSerializerExtractor (serializerClassMetadataFactory);//必须配置' serializer_groups '选项(可以设置为null)serializerExtractor->getproperty (, (“serializer_groups”= > [组的mygroup”]]);

如果serializer_groups设置为,序列化器组元数据将不会被检查,但您将只得到序列化器组件考虑的属性(特别是@ ignore注释被考虑在内)。

5.2

支持价值serializer_groups在Symfony 5.2中引入。ob娱乐下载

DoctrineExtractor

请注意

这个提取器依赖于ob娱乐下载symfony / doctrine-bridge而且教义/ orm库。

使用实体映射数据教义ORM,DoctrineExtractor提供列表和类型信息。类自动注册此提取器property_infoSymfony框架中的服务:ob娱乐下载

12 3 4 5 6 7 8 9 10 11 12 13 14 15
使用学说ORMEntityManager使用学说ORM工具设置使用ob娱乐下载学说PropertyInfoDoctrineExtractor配置=设置::createAnnotationMetadataConfiguration ([__DIR__),真正的);entityManager= EntityManager::创建([“司机”= >“pdo_sqlite”/ /……),配置);doctrineExtractorDoctrineExtractor (entityManager);//列出信息。doctrineExtractor->getproperty ();//类型信息。doctrineExtractor->getTypes (财产);

创建自己的提取器

您可以通过创建实现以下一个或多个接口的类来创建自己的属性信息提取器:PropertyAccessExtractorInterfacePropertyDescriptionExtractorInterfacePropertyListExtractorInterfacePropertyTypeExtractorInterface而且PropertyInitializableExtractorInterface

如果您已经使用FrameworkBundle启用了PropertyInfo组件,那么您可以自动地将提取器类注册到property_info通过将其定义为具有以下一个或多个特性的服务标签

  • property_info.list_extractor如果它提供列表信息。
  • property_info.type_extractor如果它提供类型信息。
  • property_info.description_extractor是否提供描述信息。
  • property_info.access_extractor如果它提供访问信息。
  • property_info.initializable_extractor如果它提供了可初始化的信息(它检查属性是否可以通过构造函数初始化)。
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。
ob娱乐下载Symfony 5.4支持通过私人Packagist