beerline / php-custom-annotations
愉快地创建和使用自定义PHP注解。
0.3.2
2020-09-09 14:59 UTC
Requires
- php: ^7.2
- doctrine/annotations: ^1.6
README
愉快地创建和使用自定义PHP注解。
安装
步骤 1:下载软件包 打开命令行,进入您的项目目录,并执行以下命令以下载此软件包的最新稳定版本:$ composer require beerline/php-custom-annotations
步骤 2:启用软件包 对于Symfony,在config/services.yaml
中声明新的服务。
services: // Your services here Beerline\PhpCustomAnnotations\Metadata\PropertyMetadataPicker: class: 'Beerline\PhpCustomAnnotations\Metadata\PropertyMetadataPicker'
如何使用
为类的属性添加元数据
- 创建元数据类。
- 将注解
@Annotation
和@Annotation\Target("PROPERTY")
添加到元数据类。 - 使用元数据类注解您的类的属性。
- 使用
Beerline\PhpCustomAnnotations\Metadata\PropertyMetadataPicker::findPropertiesAllMetadata( object $entity )
获取给定类中所有属性的注解数组。 - 使用
Beerline\PhpCustomAnnotations\Metadata\PropertyMetadataPicker::findPropertyCertainMetadata( object $entity, string $metadataClassName )
方法获取具有特定元数据类的属性。$metadataClassName
是元数据类的名称。
示例
假设我们有一个Product类。
class Product { /** @var int */ private $id; /** @var \DateTime */ private $dateProduction; /** * @var string * @Translate(translatable=true) */ private $name; /** * @var string * @Translate(translatable=true) */ private $description; public function __construct( string $name, DateTime $date, string $description) { $this->name = $name; $this->dateProduction = $date; $this->description = $description; } }
其中一些属性应该被翻译
- name
- description
为了指定哪些属性应该被翻译,让我们创建一个名为Translatable
的元数据类
/** * @Annotation * @Annotation\Target("PROPERTY") */ class Translatable { /** * @Required * @var boolean */ public $translatable; }
现在用元数据类标记name
和description
属性
// ... /** * @var string * @Translatable(translatable=true) */ private $name; /** * @var string * @Translatable(translatable=true) */ private $description // ...
这就足够了。现在您需要使用PropertyMetadataPicker
来获取这些属性
<?php use Doctrine\Common\Annotations\AnnotationReader; use Beerline\PhpCustomAnnotations\Metadata\PropertyMetadataPicker; $product = new Product( 'iPhone', now(), 'Designed by Apple in California' ); $propertyMetadataPicker = new PropertyMetadataPicker( new AnnotationReader() ); $propertiesMetadata = $propertyMetadataPicker->findPropertyCertainMetadata( $product, Translatable::class ); foreach ($propertiesMetadata as $property) { foreach ($property->getMetadataClass() as $metadataClass){ if ( $metadataClass instanceof Translate) { echo $property->getPropertyName() . ': ' . $metadataClass->translatable . "\n"; } } }
// result
// name: 1
// description: 1