beerline/php-custom-annotations

愉快地创建和使用自定义PHP注解。

0.3.2 2020-09-09 14:59 UTC

This package is auto-updated.

Last update: 2024-09-10 00:11:52 UTC


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'

如何使用

为类的属性添加元数据

  1. 创建元数据类。
  2. 将注解@Annotation@Annotation\Target("PROPERTY")添加到元数据类。
  3. 使用元数据类注解您的类的属性。
  4. 使用Beerline\PhpCustomAnnotations\Metadata\PropertyMetadataPicker::findPropertiesAllMetadata( object $entity )获取给定类中所有属性的注解数组。
  5. 使用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;
    }

现在用元数据类标记namedescription属性

    // ...
        /**
         * @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