PropertyInfo组件
编辑该页面PropertyInfo组件
PropertyInfo组件允许您获取信息类属性通过使用不同来源的元数据。
而PropertyAccess组件可以读取和写入值/从对象和数组,PropertyInfo组件工作只与类定义提供信息的数据类型和可见性——包括通过getter或setter方法——在这个类的属性。
安装
1
美元作曲家需要symfony / prob娱乐下载operty-info
请注意
如果你安装这个组件之外的Symfony应用程序,你必须要求ob娱乐下载供应商/ 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;使用ob娱乐下载\组件\PropertyInfo\器\PhpDocExtractor;使用ob娱乐下载\组件\PropertyInfo\器\ReflectionExtractor;使用ob娱乐下载\组件\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 (美元类);
器命令
器实例数组内的顺序是非常重要的:第一个非空将返回结果。这就是为什么你必须提供每个类别提取器作为一个单独的数组,即使一个器提供了多个类别信息。
例如,虽然ReflectionExtractor和DoctrineExtractor提供列表和类型信息更好的方法可能是:
- 的ReflectionExtractor优先级列表信息,所有属性在类返回(不仅仅是映射属性)。
的DoctrineExtractor有优先考虑的类型信息,所以实体元数据是用来代替类型提示提供更精确的类型信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
使用ob娱乐下载\桥\学说\PropertyInfo\DoctrineExtractor;使用ob娱乐下载\组件\PropertyInfo\器\ReflectionExtractor;使用ob娱乐下载\组件\PropertyInfo\PropertyInfoExtractor;美元reflectionExtractor=新ReflectionExtractor ();美元doctrineExtractor=新DoctrineExtractor (/ *……* /);美元propertyInfo=新PropertyInfoExtractor (/ /列表提取器(美元reflectionExtractor,美元doctrineExtractor),/ /类型提取器(美元doctrineExtractor,美元reflectionExtractor]);
可推断出的信息
的PropertyInfoExtractor类公开公共方法提取几种类型的信息:
- 的属性列表:getproperty ()
- 属性类型:getTypes ()(包括输入属性)
- 属性描述:getShortDescription ()和getLongDescription ()
- 属性访问的细节:isReadable ()和isWritable ()
- 通过构造函数属性initializable:isInitializable ()
请注意
一定要通过类器的方法名称,而不是一个对象:
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]= >类Symfoob娱乐下载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 ()返回真正的
如果给定类的构造函数的参数匹配给定的属性名。
类型的对象
相比其他提取器,类型信息提取器提供更多的信息比可以表示成简单的标量值。由于这个原因,类型提取器返回的数组类型支持对象为每种类型的属性。
例如,如果一个属性既支持整数
和字符串
(通过@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 ()方法。
请注意
的列表
伪PropertyInfo组件作为一个数组返回的类型是与整数类型的关键。
提取器
执行财产信息的提取器类。一个提取类可以提供一个或多个类型的属性信息通过实施正确的接口(s)。
的PropertyInfoExtractor将迭代相关器类的顺序与它们的集合,调用适当的方法并返回第一个结果,不是吗零
。
虽然您可以创建自己的提取器,以下是已经可以覆盖大部分用例:
ReflectionExtractor
使用PHP反射,ReflectionExtractor提供列表,从setter和取值方法类型和访问信息。它也可以给一个属性的类型(甚至从构造函数参数提取它),如果是通过构造函数initializable。它支持返回和标量类型:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
使用ob娱乐下载\组件\PropertyInfo\器\ReflectionExtractor;美元reflectionExtractor=新ReflectionExtractor ();/ /列表信息。美元reflectionExtractor- >getproperty (美元类);/ /类型信息。美元reflectionExtractor- >getTypes (美元类,美元财产);/ /获取信息。美元reflectionExtractor- >isReadable (美元类,美元财产);美元reflectionExtractor- >isWritable (美元类,美元财产);/ / Initializable信息美元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娱乐下载\组件\PropertyInfo\器\PhpDocExtractor;美元phpDocExtractor=新PhpDocExtractor ();/ /类型信息。美元phpDocExtractor- >getTypes (美元类,美元财产);/ /描述信息。美元phpDocExtractor- >getShortDescription (美元类,美元财产);美元phpDocExtractor- >getLongDescription (美元类,美元财产);
PhpStanExtractor
请注意
这个提取器依赖于phpstan / phpdoc-parser和phpdocumentor / reflection-docblock库。
这由于PHPStan解析器读取信息。它从注释的属性和方法,收集信息等@var
,@param
或@return
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/ / src /域/直接给类喷火{私人美元酒吧;/ * * *@param字符串$ * /公共函数__construct(美元酒吧){美元这- >酒吧=美元酒吧;}}/ / Extraction.php使用ob娱乐下载\组件\PropertyInfo\器\PhpStanExtractor;美元phpStanExtractor=新PhpStanExtractor ();美元phpStanExtractor- >getTypesFromConstructor (Foo::类,“酒吧”);
6.1
的PhpStanExtractor
是在Symfony 6.1中引入的。ob娱乐下载
SerializerExtractor
请注意
这个提取器依赖于ob娱乐下载symfony /序列化器图书馆。
使用组元数据从序列化器组件,SerializerExtractor提供列表信息。这个提取器不自动注册的property_info
服务在Symfony框架:ob娱乐下载
1 2 3 4 5 6 7 8 9 10 11 12
使用学说\常见的\注释\AnnotationReader;使用ob娱乐下载\组件\PropertyInfo\器\SerializerExtractor;使用ob娱乐下载\组件\序列化器\映射\工厂\ClassMetadataFactory;使用ob娱乐下载\组件\序列化器\映射\加载程序\AnnotationLoader;美元serializerClassMetadataFactory=新ClassMetadataFactory (新AnnotationLoader (新AnnotationReader));美元serializerExtractor=新SerializerExtractor (美元serializerClassMetadataFactory);/ /必须配置“serializer_groups”选项(可以设置为null)美元serializerExtractor- >getproperty (美元类,(“serializer_groups”= > [组的mygroup”]]);
如果serializer_groups
被设置为零
序列化器组元数据不会检查但你只会被序列化器组件(特别是属性@ ignore
注释是考虑)。
DoctrineExtractor
请注意
这个提取器依赖于ob娱乐下载symfony / doctrine-bridge和教义/ orm库。
使用实体映射数据教义ORM,DoctrineExtractor提供列表和类型信息。这个提取器是不会自动注册的property_info
服务在Symfony框架:ob娱乐下载
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
使用学说\ORM\EntityManager;使用学说\ORM\工具\设置;使用ob娱乐下载\桥\学说\PropertyInfo\DoctrineExtractor;美元配置=设置::createAnnotationMetadataConfiguration ([__DIR__),真正的);美元entityManager= EntityManager::创建([“司机”= >“pdo_sqlite”,/ /……),美元配置);美元doctrineExtractor=新DoctrineExtractor (美元entityManager);/ /列表信息。美元doctrineExtractor- >getproperty (美元类);/ /类型信息。美元doctrineExtractor- >getTypes (美元类,美元财产);
创建自己的公司
您可以创建自己的属性信息提取器通过创建一个类实现一个或多个以下接口:PropertyAccessExtractorInterface,PropertyDescriptionExtractorInterface,PropertyListExtractorInterface,PropertyTypeExtractorInterface和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
如果它提供initializable信息(它检查如果一个属性可以通过构造函数初始化)。