对具有不同服务参数的多个实体使用相同的EntityListener

时间:2017-02-01 08:57:25

标签: php symfony doctrine yaml

当EntityListener注册为服务时,是否可以使用不同的参数多次注册同一个类,并将它们与特定实体相关联?

考虑以下实体:

/**
 * Class EntityA
 * @ORM\Entity
 * @ORM\EntityListeners({"myBundle\EventListener\SharedListener"})
 */
class EntityA implements sharedBehaviourInterface
{
    // stuff here
}

/**
 * Class EntityB
 * @ORM\Entity
 * @ORM\EntityListeners({"myBundle\EventListener\SharedListener"})
 */
class EntityB implements sharedBehaviourInterface
{
    // stuff here
}

我想为以前的两个实体注册以下监听器:

class SharedListener
{
    private $usefulParameter;

    public function __construct($usefulParameter)
    {
        $this->usefulParameter = $usefulParameter;
    }

    /**
     * @PrePersist
     *
     */
    public function prePersist(sharedBehaviourInterface $dbFile, LifecycleEventArgs $event)
    {
        // code here
    }

    // more methods
}

使用:

mybundle.entitya.listener:
    class: myBundle\EventListener\SharedListener
    arguments:
        - '%entitya.parameter%' # The important change goes here ...
    tags:
        - { name: doctrine.orm.entity_listener }
mybundle.entityb.listener:
    class: myBundle\EventListener\SharedListener
    arguments:
        - '%entityb.parameter%' # ... and here
    tags:
        - { name: doctrine.orm.entity_listener }

它不起作用,我真的很惊讶Entity中的EntityListener声明是针对Listener类而不是服务的。是否可以针对特定服务?喜欢:

@ORM\EntityListeners({"mybundle.entityb.listener"})

或者我试图做的事情是不可能的?

2 个答案:

答案 0 :(得分:1)

您可以使用@configured_service_id表示法将其他服务注入服务。这适用于构造函数参数和setter注入。

一般来说:不要试图在不需要的地方找到抽象。 大多数情况下,长期使用一点代码重复就容易多了。

我会为每个目的简单地构建两个独立的侦听器。

如果实体不是应该使用同一个侦听器处理的两个实体之一,请执行一个跳出处理程序的简单检查:

<?php
use Doctrine\Common\Persistence\Event\LifecycleEventArgs;

class MyEventListener
{
    public function preUpdate(LifecycleEventArgs $args)
    {
        $entity = $args->getObject();
        $entityManager = $args->getObjectManager();

        if (!$entity instanceof EntityA && !$entity instanceof EntityB) {
            return;
        }

        /* Your listener code */
    }
}

答案 1 :(得分:0)

你确定,这不会有诀窍:

config_dev.yml