代码之家  ›  专栏  ›  技术社区  ›  simont basooli

判别图标注中的环境变量或函数

  •  0
  • simont basooli  · 技术社区  · 6 年前

    我有一个实体使用具有鉴别器列的单表继承:

    @ORM\DiscriminatorMap({1="Product", 2="User"})

    1, 2 )我的生产和开发环境各不相同,因此需要动态设置这些值。不幸的是,在 Doctrine annotation documentation .

    @ORM\DiscriminatorMap('%discrimination_array%')
    

    然后定义 discrimination_array doctrine.yaml :

    discrimination_array: '{%env(PRODUCT)%="Product", %env(USER)%="User"}'
    

    以及相应的环境变化 .env :

    PRODUCT=1
    USER=2
    

    然而,教条会抛出错误,比如

    将varchar值'%env(PRODUCT)%'转换为数据类型smallint时,转换失败。

    是否可以根据当前环境设置类判别图?

    0 回复  |  直到 6 年前
        1
  •  1
  •   simont basooli    6 年前

    fires an event

    读取实体的映射信息时,会将其填充到ClassMetadataInfo实例中。您可以连接到此进程并操作实例。

    通过订阅此事件,可以设置实体的 DiscriminatorMap 实体加载后。

    这是一个一般的例子。首先,实现订阅服务器。加载相关实体时( Item::class 歧视折磨 .

    <?php
    
    namespace App\Doctrine\Listener;
    
    use App\Entity\Item;
    use Doctrine\Common\EventSubscriber;
    use Doctrine\ORM\Event\LoadClassMetadataEventArgs;
    
    class LoadClassMetadataSubscriber implements EventSubscriber
    {
        private $discriminatorMap;
    
        public function __construct( $discriminatorMap)
        {
            $this->discriminatorMap = $discriminatorMap;
        }
    
        public function getSubscribedEvents()
        {
            return [
                Events::loadClassMetadata
            ];
        }
    
        /**
         * @param LoadClassMetadataEventArgs $eventArgs
         */
        public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs)
        {
            /**
             * @var \Doctrine\ORM\Mapping\ClassMetadata $classMetadata
             */
            $classMetadata = $eventArgs->getClassMetadata();
    
            if ($classMetadata->name !== Item::class) {
                return;
            }
    
            $map = [];
            foreach ($this->discriminatorMap as $value) {
                $partial = explode('=', $value);
                $map[$partial[0]] = $partial[1];
            }
    
            $classMetadata->setDiscriminatorMap($map);
        }
    }
    
    

    之后 类已被解析, Entity\Item 注释:

    <?php
    
    namespace App\Entity;
    
    use App\Map;
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * @ORM\Entity(...)
     * @ORM\Table(...)
     * @ORM\InheritanceType("SINGLE_TABLE")
     * @ORM\DiscriminatorColumn(name="discr", type="string")
     */
    abstract class Item {
    

    应将映射添加到环境中( .env

    DISCRIMINATOR_MAP=one=App\Entity\Item\One,two=App\Entity\Item\Two
    

    将订阅服务器注册到正确的事件( config/services.yaml

    services:
        ...
    
        # Set up the custom subscriber. It'll take the environmental variable as
        # an argument, and subscribe to the `loadClassMetadata` event. 
        App\Doctrine\Listener\LoadClassMetadataSubscriber:
            public: true
            arguments:
                - '%env(csv:MAP)%'
            tags:
                - { name: doctrine.event_listener, event: loadClassMetadata, lazy: true }
    
    
    推荐文章