PropertyInfo组件

编辑该页面

PropertyInfo组件

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

PropertyAccess组件可以读取和写入值/从对象和数组,PropertyInfo组件工作只与类定义提供信息的数据类型和可见性——包括通过getter或setter方法——在这个类的属性。

安装

1
美元作曲家需要symfony / pr欧宝娱乐app下载地址operty-info

请注意

如果你安装这个组件之外的Symfony应用程序,你必须要求欧宝娱乐app下载地址供应商/ autoload.php文件在你的代码,使作曲家提供的类加载机制。读这篇文章为更多的细节。

对一些可能需要额外的依赖关系该组件提供的提取器

使用

使用这个组件,创建一个新的PropertyInfoExtractor实例和为它提供一组信息提取器:

1 2 3 4 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;使用欧宝娱乐app下载地址\组件\PropertyInfo\\PhpDocExtractor;使用欧宝娱乐app下载地址\组件\PropertyInfo\\ReflectionExtractor;使用欧宝娱乐app下载地址\组件\PropertyInfo\PropertyInfoExtractor;/ /提取器进一步所示的完整列表美元phpDocExtractor=PhpDocExtractor ();美元reflectionExtractor=ReflectionExtractor ();/ /列表PropertyListExtractorInterface(任何iterable)美元listExtractors= (美元reflectionExtractor];/ /列表PropertyTypeExtractorInterface(任何iterable)美元typeExtractors= (美元phpDocExtractor,美元reflectionExtractor];/ /列表PropertyDescriptionExtractorInterface(任何iterable)美元descriptionExtractors= (美元phpDocExtractor];/ /列表PropertyAccessExtractorInterface(任何iterable)美元accessExtractors= (美元reflectionExtractor];/ /列表PropertyInitializableExtractorInterface(任何iterable)美元propertyInitializableExtractors= (美元reflectionExtractor];美元propertyInfo=PropertyInfoExtractor (美元listExtractors,美元typeExtractors,美元descriptionExtractors,美元accessExtractors,美元propertyInitializableExtractors);/ /示例,请参阅下面的内容美元= YourAwesomeCoolClass::类;美元属性=美元propertyInfo- >getproperty (美元);

器命令

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

例如,虽然ReflectionExtractorDoctrineExtractor提供列表和类型信息更好的方法可能是:

  • ReflectionExtractor优先级列表信息,所有属性在类返回(不仅仅是映射属性)。
  • DoctrineExtractor有优先考虑的类型信息,所以实体元数据是用来代替类型提示提供更精确的类型信息:

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
    使用欧宝娱乐app下载地址\\学说\PropertyInfo\DoctrineExtractor;使用欧宝娱乐app下载地址\组件\PropertyInfo\\ReflectionExtractor;使用欧宝娱乐app下载地址\组件\PropertyInfo\PropertyInfoExtractor;美元reflectionExtractor=ReflectionExtractor ();美元doctrineExtractor=DoctrineExtractor (/ *……* /);美元propertyInfo=PropertyInfoExtractor (/ /列表提取器(美元reflectionExtractor,美元doctrineExtractor),/ /类型提取器(美元doctrineExtractor,美元reflectionExtractor]);

可推断出的信息

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

请注意

一定要通过器的方法名称,而不是一个对象:

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)“用户名”[1]= >字符串(8)“密码”[2]= >字符串(6)“活跃”}* /

类型信息

提取器实现PropertyTypeExtractorInterface提供大量的数据类型信息一个属性:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
美元类型=美元propertyInfo- >getTypes (美元,美元财产);/ *例子的结果- - - - - - - - - - - - - - - -数组(1){[0]= >类Symfo欧宝娱乐app下载地址ny \ PropertyInfo \ \组件类型(6){私人builtinType美元= >字符串(6)“字符串”私人nullable美元= > bool (false)私人类= >零私人收藏美元= > bool (false)私人collectionKeyType = >零私人collectionValueType美元= >零}}* /

看到PropertyInfo组件对于信息类型类。

描述信息

提取器实现PropertyDescriptionExtractorInterface提供长期和短期的描述从一个属性注释字符串:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
美元标题=美元propertyInfo- >getShortDescription (美元,美元财产);/ *例子的结果- - - - - - - - - - - - - - - -字符串(41)“这是第一行DocComment。”* /美元=美元propertyInfo- >getLongDescription (美元,美元财产);/ *例子的结果- - - - - - - - - - - - - - - -字符串(79):这是DocComment随后的段落。它可以跨越多个行。* /

访问信息

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

1 2 3 4 5
美元propertyInfo- >isReadable (美元,美元财产);/ /例结果:bool(真正的)美元propertyInfo- >isWritable (美元,美元财产);/ /例结果:bool(假)

ReflectionExtractor寻找getter /伊塞/ setter /有方法除了公共财产来确定是否访问。基于这样的PropertyAccess的工作原理。

属性Initializable信息

提取器实现PropertyInitializableExtractorInterface通过该类的构造函数提供属性是否initializable作为布尔值:

1 2
美元propertyInfo- >isInitializable (美元,美元财产);/ /例结果:bool(真正的)

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

提示

主要的PropertyInfoExtractor类实现接口,委托财产信息的提取的萃取器注册。

这意味着任何方法可以在每个萃取器也可以在主PropertyInfoExtractor类。

类型的对象

相比其他提取器,类型信息提取器提供更多的信息比可以表示成简单的标量值。由于这个原因,类型提取器返回的数组类型支持对象为每种类型的属性。

例如,如果一个属性既支持整数字符串(通过@return int |字符串注释),PropertyInfoExtractor: getTypes ()将返回一个数组,其中包含吗两个的实例类型类。

请注意

大多数萃取器将返回只有一个类型实例。的PhpDocExtractor是目前唯一器数组中返回多个实例。

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

类型::getBuiltInType ()

类型::getBuiltinType ()方法返回PHP内置的数据类型,它可以是一个字符串值:数组,bool,可调用的,浮动,int,iterable,,对象,资源字符串

常量在类型类,在表单中类型::BUILTIN_TYPE_ *,提供了方便。

类型::isNullable ()

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

类型::getClassName ()

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

类型::isCollection ()

类型::isCollection ()方法将返回一个布尔值表示如果属性参数是一个集合包含其他值——一种基本价值的能力。目前这返回真正的如果:

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

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

如果属性是一个集合,其他类型对象可能是返回的键和值类型的集合(如果可用)的信息,通过类型::getCollectionKeyTypes ()类型::getCollectionValueTypes ()方法。

提取器

执行财产信息的提取器类。一个提取类可以提供一个或多个类型的属性信息通过实施正确的接口(s)。

PropertyInfoExtractor将迭代相关器类的顺序与它们的集合,调用适当的方法并返回第一个结果,不是吗

虽然您可以创建自己的提取器,以下是已经可以覆盖大部分用例:

ReflectionExtractor

使用PHP反射,ReflectionExtractor提供列表,从setter和取值方法类型和访问信息。它也可以给一个属性的类型(甚至从构造函数参数提取它),如果是通过构造函数initializable。它支持返回和标量类型为PHP 7:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
使用欧宝娱乐app下载地址\组件\PropertyInfo\\ReflectionExtractor;美元reflectionExtractor=ReflectionExtractor ();/ /列表信息。美元reflectionExtractor- >getproperty (美元);/ /类型信息。美元reflectionExtractor- >getTypes (美元,美元财产);/ /获取信息。美元reflectionExtractor- >isReadable (美元,美元财产);美元reflectionExtractor- >isWritable (美元,美元财产);/ / Initializable信息美元reflectionExtractor- >isInitializable (美元,美元财产);

请注意

当使用Symfony框架,这个欧宝娱乐app下载地址服务时自动注册property_info功能启用:

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

PhpDocExtractor

请注意

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

使用phpDocumentor反射解析属性和方法的注释,PhpDocExtractor提供类型和描述信息。这个提取器是自动注册property_info在Symfon欧宝娱乐app下载地址y框架如果依赖的库:

1 2 3 4 5 6 7 8 9
使用欧宝娱乐app下载地址\组件\PropertyInfo\\PhpDocExtractor;美元phpDocExtractor=PhpDocExtractor ();/ /类型信息。美元phpDocExtractor- >getTypes (美元,美元财产);/ /描述信息。美元phpDocExtractor- >getShortDescription (美元,美元财产);美元phpDocExtractor- >getLongDescription (美元,美元财产);

SerializerExtractor

请注意

这个提取器依赖于欧宝娱乐app下载地址symfony /序列化器图书馆。

使用组元数据序列化器组件,SerializerExtractor提供列表信息。这个提取器自动注册的property_info服务在Symfony框架:欧宝娱乐app下载地址

1 2 3 4 5 6 7 8 9 10 11 12
使用学说\常见的\注释\AnnotationReader;使用欧宝娱乐app下载地址\组件\PropertyInfo\\SerializerExtractor;使用欧宝娱乐app下载地址\组件\序列化器\映射\工厂\ClassMetadataFactory;使用欧宝娱乐app下载地址\组件\序列化器\映射\加载程序\AnnotationLoader;美元serializerClassMetadataFactory=ClassMetadataFactory (AnnotationLoader (AnnotationReader));美元serializerExtractor=SerializerExtractor (美元serializerClassMetadataFactory);/ /必须配置“serializer_groups”选项(可以设置为null)美元serializerExtractor- >getproperty (美元,(“serializer_groups”= > [组的mygroup”]]);

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

5.2

支持价值serializer_groups是在Symfony 5.2中引入的。欧宝娱乐app下载地址

DoctrineExtractor

请注意

这个提取器依赖于欧宝娱乐app下载地址symfony / doctrine-bridge教义/ orm库。

使用实体映射数据教义ORM,DoctrineExtractor提供列表和类型信息。这个提取器是不会自动注册的property_info服务在Symfony框架:欧宝娱乐app下载地址

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
使用学说\ORM\EntityManager;使用学说\ORM\工具\设置;使用欧宝娱乐app下载地址\\学说\PropertyInfo\DoctrineExtractor;美元配置=设置::createAnnotationMetadataConfiguration ([__DIR__),真正的);美元entityManager= EntityManager::创建([“司机”= >“pdo_sqlite”,/ /……),美元配置);美元doctrineExtractor=DoctrineExtractor (美元entityManager);/ /列表信息。美元doctrineExtractor- >getproperty (美元);/ /类型信息。美元doctrineExtractor- >getTypes (美元,美元财产);

创建自己的公司

您可以创建自己的属性信息提取器通过创建一个类实现一个或多个以下接口:PropertyAccessExtractorInterface,PropertyDescriptionExtractorInterface,PropertyListExtractorInterface,PropertyTypeExtractorInterfacePropertyInitializableExtractorInterface

(如果已启用FrameworkBundle PropertyInfo组件,您可以自动注册你的器类的property_info通过定义它作为一个服务与一个或多个以下标签:

  • property_info.list_extractor如果它提供列表信息。
  • property_info.type_extractor如果它提供类型信息。
  • property_info.description_extractor如果它提供描述信息。
  • property_info.access_extractor如果它提供访问信息。
  • property_info.initializable_extractor如果它提供initializable信息(它检查如果一个属性可以通过构造函数初始化)。
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。
欧宝娱乐app下载地址Symfony 5.4支持通过私人Packagist