propertyInfo组件

propertyInfo组件

propertyInfo组件允许您使用不同的元数据来获取有关类属性的信息。

虽然这一点propertyaccess组件允许您读取和写入对象和数组的值,PropertyInfo组件仅使用类定义来提供有关数据类型和可见性的信息 - 包括Via Getter或Setter方法 - 该类中的属性。

安装

1
$Composer需要Symfony欧宝娱乐app下载地址 / Property-Info

笔记

如果在Symfony应用程序之外安装此组件,则必须要求欧宝娱乐app下载地址供应商/ autoload.php.代码中的文件以启用Composer提供的类自动加载机制。读本文更多细节。

可能需要其他依赖性提取器提供此组件

用法

要使用此组件,请创建一个新的欧宝娱乐app下载地址symfony \ component \ propertyInfo \ propertyInfoExtractor实例并通过一组信息提取器提供:

example \ namespace \ yourawesomecoollass;欧宝娱乐app下载地址symfony \ component \ propertyInfo \ extractor \ phpdocextractor;欧宝娱乐app下载地址symfony \ component \ propertyInfo \ Extractor \ ReflectionExtractor;欧宝娱乐app下载地址symfony \ component \ propertyInfo \ propertyInfoExtractor;//一个完整的提取器列表如下所示$ phpdoxtractor.=新的phpdocextractor.();$反射伸缩器=新的反射呼吸反射器();// propertyyListextractor接口(任何可迭代)列表$ listExtractors.=[$反射伸缩器];// propertytypeextractor接口列表(任何可迭代)$ typeextractors.=[$ phpdoxtractor.$反射伸缩器];// propertyDescriptionExtractorInterface(任何可迭代)列表$ disponsextractors.=[$ phpdoxtractor.];// propertyAccessExtractor接口(任何可迭代)列表$ AccessExtractors.=[$反射伸缩器];// propertyInitializableExtractorInterface(任何可迭代)列表$ propertyInitializableExtractors.=[$反射伸缩器];$ propertinfo.=新的propertyinfoextractor.$ listExtractors.$ typeextractors.$ disponsextractors.$ AccessExtractors.$ propertyInitializableExtractors.);//见下文有关详细信息$班级=yourawesomecoolclass.::班级;$属性=$ propertinfo.- >getProperties.$班级);

提取器订购

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

例如,虽然欧宝娱乐app下载地址symfony \ component \ propertyInfo \ Extractor \ ReflectionExtractor欧宝娱乐app下载地址symfony \ bridge \ doctrine \ propertrinefo \ doctrinextractor提供列表和类型信息可能更好:

  • 欧宝娱乐app下载地址symfony \ component \ propertyInfo \ Extractor \ ReflectionExtractor列出信息优先级,以便返回类中的所有属性(不仅是映射属性)。

  • 欧宝娱乐app下载地址symfony \ bridge \ doctrine \ propertrinefo \ doctrinextractor优先级为类型信息,以便使用实体元数据而不是类型暗示,以提供更准确的类型信息:

    欧宝娱乐app下载地址symfony \ bridge \ doctrine \ propertrinefo \ doctrinextractor;欧宝娱乐app下载地址symfony \ component \ propertyInfo \ Extractor \ ReflectionExtractor;欧宝娱乐app下载地址symfony \ component \ propertyInfo \ propertyInfoExtractor;$反射伸缩器=新的反射呼吸反射器();$ doctrineextractor.=新的教学Xtractor/ * ... * /);$ propertinfo.=新的propertyinfoextractor.//列表提取者[$反射伸缩器$ doctrineextractor.],//类型提取器[$ doctrineextractor.$反射伸缩器]);

可提取的信息

欧宝娱乐app下载地址symfony \ component \ propertyInfo \ propertyInfoExtractor类公开公共方法以提取几种类型的信息:

笔记

一定要通过一个班级名称,不是Extractor方法的对象:

// 坏的!它可能工作,但不是所有提取者$ propertinfo.- >getProperties.$ awesmeObject.);// 好的!$ propertinfo.- >getProperties.get_class.$ awesmeObject.));$ propertinfo.- >getProperties.'example \ namespace \ yourawesomeclass');$ propertinfo.- >getProperties.yourawesomeclass.::班级);

列出信息

实施的提取器欧宝娱乐app下载地址symfony \ component \ propertyInfo \ propertyListextractorInterface提供类上可用的属性列表,作为包含每个属性名称的数组作为字符串:

$属性=$ propertinfo.- >getProperties.$班级);/ *示例结果---------------阵列(3){[0] =>字符串(8)“用户名”[1] =>字符串(8)“密码”[2] =>字符串(6)“活动”}* /

输入信息

实施的提取器欧宝娱乐app下载地址symfony \ component \ propertyinfo \ propertytypeextractorInterface提供广泛的数据类型信息适合房产:

$类型=$ propertinfo.- >葛底梯$班级$财产);/ *示例结果---------------阵列(1){[0] =>class 欧宝娱乐app下载地址symfony \ component \ propertyInfo \ type(6){私有$ ILUBEDINTYPY => String(6)“字符串”私人$ nullable => bool(false)私人$ class => null私人$ Collection => BOOL(假)私人$ CollectionKeyType => null私人$ COOPLECTVALUETYPE => null}}* /

类型对象有关信息的信息类型班级。

描述信息

实施的提取器欧宝娱乐app下载地址symfony \ component \ propertyInfo \ propertyDescriptionExtractorInterface提供从属性注释的长短描述字符串:

$ tale.=$ propertinfo.- >getshortdescription.$班级$财产);/ *示例结果---------------字符串(41)“这是Doc Comment的第一行。”* /$段=$ propertinfo.- >getlongdescription.$班级$财产);/ *示例结果---------------字符串(79):这些是DocComment的后续段落。它可以跨越多行。* /

访问信息

实施的提取器欧宝娱乐app下载地址symfony \ component \ propertyInfo \ propertyAccessExtractorInterface提供属性是可读还是可写作Booleans:

$ propertinfo.- >可爱$班级$财产);//示例结果:bool(true)$ propertinfo.- >itflity.$班级$财产);//示例结果:bool(false)

欧宝娱乐app下载地址symfony \ component \ propertyInfo \ Extractor \ ReflectionExtractor除了属性是否是公共的情况外,还要查找游戏/ iserer / setter / setter / hasser方法,以确定它是否可以访问。这是基于如何ProCatectaccess.作品。

属性初始化信息

实施的提取器欧宝娱乐app下载地址symfony \ component \ propertyInfo \ propertyInitializableExtractorInterface提供属性是否通过类的构造函数作为布尔值:

$ propertinfo.- >是isinitializable.$班级$财产);//示例结果:bool(true)

Isinitializable()回报真的如果给定类的构造函数的参数匹配给定的属性名称。

小费

主要的欧宝娱乐app下载地址symfony \ component \ propertyInfo \ propertyInfoExtractor类实现所有接口,将属性信息提取到已注册的提取器。

这意味着每个提取器上可用的任何方法也可在主机上使用欧宝娱乐app下载地址symfony \ component \ propertyInfo \ propertyInfoExtractor班级。

类型对象

与其他提取器相比,型信息提取器提供的信息比可以表示为简单的标量值的更多信息。因此,类型提取器返回一系列欧宝娱乐app下载地址symfony \ component \ propertyInfo \类型属性支持的每种类型的对象。

例如,如果属性支持两者整数细绳(通过这一点@返回int |字符串注解),propertyInfoExtractor :: GetTypes()将返回包含的数组的实例欧宝娱乐app下载地址symfony \ component \ propertyInfo \类型班级。

笔记

大多数提取器只会返回一个欧宝娱乐app下载地址symfony \ component \ propertyInfo \类型实例。这欧宝娱乐app下载地址symfony \ component \ propertyInfo \ extractor \ phpdocextractor目前是唯一一个返回数组中多个实例的提取器。

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

类型:: getBuiltIntype()

类型:: getBuiltIntype()方法返回内置的PHP数据类型,可以是其中一个字符串值:大批BOOL.可谴责漂浮迭代空值目的资源或者细绳

内部的常量欧宝娱乐app下载地址symfony \ component \ propertyInfo \类型类,在表格中类型:: build_type_ *,为方便起见提供。

类型:: Isnullable()

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

类型:: getClassName()

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

类型:: iScollection()

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

  • 内置PHP数据类型大批;
  • 突变方法属性来自具有前缀添加或者去掉(定义为数组突变前缀列表);
  • phpdocumentor.注释是“收集”(例如)@var.SomeClass @var.SomeClass @var.Doctrine \ common \ collections \ collection , 等等。)

类型:: getCollectionKeyType()类型:: getCollectionValueType()

如果属性是集合,则可以返回所附加的类型对象,用于集合的键和值类型(如果提供信息),则可以通过类型:: getCollectionKeyType()类型:: getCollectionValueType()方法。

提取器

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

欧宝娱乐app下载地址symfony \ component \ propertyInfo \ propertyInfoExtractor将按照它们设置的顺序迭代相关的提取器类,调用适当的方法并返回第一个不是空值

虽然您可以创建自己的提取器,但以下内容已可用以涵盖大多数使用情况:

反射呼吸反射器

使用PHP反射,欧宝娱乐app下载地址symfony \ component \ propertyInfo \ Extractor \ ReflectionExtractor提供Setter和Accessor方法的列表,类型和访问信息。它还可以给出属性的类型(甚至从构造函数参数中提取它),如果它通过构造函数初始化。它支持PHP 7的返回和标量类型:

欧宝娱乐app下载地址symfony \ component \ propertyInfo \ Extractor \ ReflectionExtractor;$反射伸缩器=新的反射呼吸反射器();//列出信息。$反射伸缩器- >getProperties.$班级);//类型信息。$反射伸缩器- >葛底梯$班级$财产);//访问信息。$反射伸缩器- >可爱$班级$财产);$反射伸缩器- >itflity.$班级$财产);//初始化信息$反射伸缩器- >是isinitializable.$班级$财产);

笔记

使用Symfony框架时,此服欧宝娱乐app下载地址务将自动注册property_info.功能已启用:

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

phpdocextractor.

笔记

这个提取器取决于phpdocumentor /反射-ocblock图书馆。

使用phpdocumentor反思解析属性和方法注释,欧宝娱乐app下载地址symfony \ component \ propertyInfo \ extractor \ phpdocextractor提供类型和描述信息。此提取器自动注册property_info.在Symfon欧宝娱乐app下载地址y框架中如果依赖库存在:

欧宝娱乐app下载地址symfony \ component \ propertyInfo \ extractor \ phpdocextractor;$ phpdoxtractor.=新的phpdocextractor.();//类型信息。$ phpdoxtractor.- >葛底梯$班级$财产);//描述信息。$ phpdoxtractor.- >getshortdescription.$班级$财产);$ phpdoxtractor.- >getlongdescription.$班级$财产);

serializerextractor.

笔记

这个提取器取决于欧宝娱乐app下载地址Symfony / Serializer.图书馆。

使用组元数据来自序列化器组件, 这欧宝娱乐app下载地址symfony \ component \ propertyInfo \ Extractor \ SerializerExtractor提供列表信息。这个提取器是不是自动注册property_info.Symfony框架中的服务:欧宝娱乐app下载地址

Doctrine \ common \ Annotations \ AnnotationReader;欧宝娱乐app下载地址symfony \ component \ propertyInfo \ Extractor \ SerializerExtractor;欧宝娱乐app下载地址symfony \ component \ serializer \ mapping \ factory \ classmetadataFactory;欧宝娱乐app下载地址Symfony \ Component \ Serializer \ Mapping \ Loader \ AnnotationLoader;$ serializerclassmetadataTaFactory.=新的ClassmetadataTaFactory.新的annotationloder.新的annotationReader.);$ SerializerExtractor.=新的serializerextractor.$ serializerclassmetadataTaFactory.);//必须配置`serializer_groups`选项(可以设置为null)$ SerializerExtractor.- >getProperties.$班级['serializer_groups'=>['我的组']]);

如果serializer_groups.设定为空值,序列化器组元数据不会被检查,但您只能获得序列化器组件所考虑的属性(值得注意的是@忽略注释被考虑在内)。

5.2版中的新增功能:支持空值价值serializer_groups.在Symfony 5.2中介绍。欧宝娱乐app下载地址

教学Xtractor

笔记

这个提取器取决于欧宝娱乐app下载地址Symfony / Doctrine-Bridge教义/ orm图书馆。

使用实体映射数据来自教义orm, 这欧宝娱乐app下载地址symfony \ bridge \ doctrine \ propertrinefo \ doctrinextractor提供列表和类型信息。此提取器未自动注册property_info.Symfony框架中的服务:欧宝娱乐app下载地址

Doctrine \ orm \ entityManager;教义\ orm \ tools \ setup;欧宝娱乐app下载地址symfony \ bridge \ doctrine \ propertrinefo \ doctrinextractor;$ config.=设置::createannotationmetadataconfiguration([__dir__],真的);$ EntityManager.=EntityManager.::创造(['司机'=>'pdo_sqlite'// ......],$ config.);$ doctrineextractor.=新的教学Xtractor$ EntityManager.);//列出信息。$ doctrineextractor.- >getProperties.$班级);//类型信息。$ doctrineextractor.- >葛底梯$班级$财产);

创建自己的提取者

您可以通过创建实现以下一个或多个接口的类来创建自己的属性信息提取器:欧宝娱乐app下载地址symfony \ component \ propertyInfo \ propertyAccessExtractorInterface欧宝娱乐app下载地址symfony \ component \ propertyInfo \ propertyDescriptionExtractorInterface欧宝娱乐app下载地址symfony \ component \ propertyInfo \ propertyListextractorInterface欧宝娱乐app下载地址symfony \ component \ propertyinfo \ propertytypeextractorInterface欧宝娱乐app下载地址symfony \ component \ propertyInfo \ propertyInitializableExtractorInterface

如果您已将PropertyInfo组件与FrameWorkBundle启用,则可以自动注册您的提取器类property_info.通过将其定义为具有以下一个或多个的服务来定义它标签

  • property_info.list_extractor.如果提供列表信息。
  • property_info.type_extractor.如果提供类型信息。
  • property_info.description_extractor.如果提供描述信息。
  • property_info.access_extractor.如果提供访问信息。
  • property_info.initializable_extractor.如果它提供初始化信息(它检查是否可以通过构造函数初始化属性)。

这项工作包括代码样本,是在a下获得的许可Creative Commons by-SA 3.0执照。