php - 对具有不同服务参数的多个实体使用相同的实体监听器

标签 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 }

它不起作用,而且我实际上很惊讶实体中的 EntityListener 声明针对的是 Listener 类而不是服务。是否可以改为针对特定服务?喜欢:

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

或者我想做的事情根本不可能实现?

最佳答案

您可以使用 @configured_service_id 符号将其他服务注入(inject)到服务中。这适用于构造函数参数和 setter 注入(inject)。

一般来说:不要试图在不需要的地方寻找抽象。 大多数时候,从长远来看,少量的代码重复会容易得多。

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

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

<?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 */
    }
}

关于php - 对具有不同服务参数的多个实体使用相同的实体监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41975571/

相关文章:

php - 我们如何在php中获取当前登录用户的用户名?

php - 流明中的 Elasticsearch 在结果数据中给出空项目

php - DQL、Doctrine ORM中如何写count(*)SQL

php - Doctrine 查询内存使用情况

PHP while循环从mysql数据库获取值(如果它等于$i值)

php - Symfony - 表单事件 - 获取新旧数据

php - 缓存 Doctrine 结果 Symfony2

php - Symfony findOneBy : column type array returns null

mysql - 在 Doctrine QueryBuilder 中,尝试根据相关实体记录的数量选择记录

php - Docker:phpize找不到config.m4