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娱乐下载\组件\PropertyInfo\器\PhpDocExtractor;使用ob娱乐下载\组件\PropertyInfo\器\ReflectionExtractor;使用ob娱乐下载\组件\PropertyInfo\PropertyInfoExtractor;//提取器的完整列表如下所示$phpDocExtractor=新PhpDocExtractor ();$reflectionExtractor=新ReflectionExtractor ();// PropertyListExtractorInterface的列表(任意可迭代)$listExtractors= ($reflectionExtractor];// PropertyTypeExtractorInterface列表(任意可迭代对象)$typeExtractors= ($phpDocExtractor,$reflectionExtractor];// PropertyDescriptionExtractorInterface的列表(任意可迭代对象)$descriptionExtractors= ($phpDocExtractor];// PropertyAccessExtractorInterface的列表(任意可迭代)$accessExtractors= ($reflectionExtractor];// PropertyInitializableExtractorInterface的列表$propertyInitializableExtractors= ($reflectionExtractor];$propertyInfo=新PropertyInfoExtractor ($listExtractors,$typeExtractors,$descriptionExtractors,$accessExtractors,$propertyInitializableExtractors);//更多例子见下面$类= 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娱乐下载\桥\学说\PropertyInfo\DoctrineExtractor;使用ob娱乐下载\组件\PropertyInfo\器\ReflectionExtractor;使用ob娱乐下载\组件\PropertyInfo\PropertyInfoExtractor;$reflectionExtractor=新ReflectionExtractor ();$doctrineExtractor=新DoctrineExtractor (/ *……* /);$propertyInfo=新PropertyInfoExtractor (//列表提取器[$reflectionExtractor,$doctrineExtractor),//类型提取器[$doctrineExtractor,$reflectionExtractor]);
可推断出的信息
的PropertyInfoExtractor类公开了公共方法来提取几种类型的信息:
- 属性列表:getproperty ()
- 属性类型:getTypes ()(包括自PHP 7.4起的类型化属性)
- 属性描述:getShortDescription ()而且getLongDescription ()
- 属性访问详细信息:isReadable ()而且isWritable ()
- 属性可通过构造函数初始化:isInitializable ()
请注意
一定要通过一个类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娱乐下载\组件\PropertyInfo\器\ReflectionExtractor;$reflectionExtractor=新ReflectionExtractor ();//列出信息。$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娱乐下载\组件\PropertyInfo\器\PhpDocExtractor;$phpDocExtractor=新PhpDocExtractor ();//类型信息。$phpDocExtractor->getTypes ($类,$财产);//描述信息。$phpDocExtractor->getShortDescription ($类,$财产);$phpDocExtractor->getLongDescription ($类,$财产);
SerializerExtractor
请注意
这个提取器依赖于ob娱乐下载symfony /序列化器图书馆。
使用组元数据从序列化器组件,SerializerExtractor提供列表信息。这个提取器是不自动注册到property_info
Symfony框架中的服务:ob娱乐下载
12 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
注释被考虑在内)。
5.2
支持零
价值serializer_groups
在Symfony 5.2中引入。ob娱乐下载
DoctrineExtractor
请注意
这个提取器依赖于ob娱乐下载symfony / doctrine-bridge而且教义/ orm库。
使用实体映射数据教义ORM,DoctrineExtractor提供列表和类型信息。类自动注册此提取器property_info
Symfony框架中的服务:ob娱乐下载
12 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
如果它提供了可初始化的信息(它检查属性是否可以通过构造函数初始化)。