由于 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
}
Using :
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
符号。这适用于构造函数参数和 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 */
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)