2015-02-10 21 views
3

我需要手动发送preRemove事件,因为我软删除一个实体,因此并不真正删除它。不过,我希望在实体被删除时触发相同的侦听器。如何在Symfony中手动分派Doctrine/Kernel事件?

我可以使用EventDispatcher(不期望LifecycleEventArgs)类似于自定义事件吗?派发香草事件的最佳方式是什么?

编辑:

感谢bosam答案,这是派遣手工香草事件的方式:

use Doctrine\ORM\Event\LifecycleEventArgs; 
use Doctrine\ORM\Events; 

$em = $this->getDoctrine()->getManager(); 
$eventManager = $em->getEventManager(); 
$eventManager->dispatchEvent(Events::preRemove, new LifecycleEventArgs($user, $em)); 

回答

5

您需要从实体管理器实例中调用getEventManager()。

例如,对于学说:

$em = $this->getDoctrine()->getManager(); 
$eventManager = $em->getEventManager(); 

然后,你可以通过使用$eventManager->dispatchEvent($eventName, EventArgs $eventArgs = null)分派事件。

+0

真棒!这只是起作用,谢谢(: – Azuli42 2015-02-10 15:17:26

3

因此,首先,事件不会 “时抛出”,他们被分派。你抛出的是例外。

您可以使用EventDispatcher分派自定义事件,并通过在您的配置中指定侦听器来侦听这些事件。

对于更多的细节,读了关于此事件的分发:http://symfony.com/doc/current/components/event_dispatcher/introduction.html#creating-and-dispatching-an-event

此外,您还可以发送任何事件是这样的:

$dispatcher = $this->get('event_dispatcher'); 
$dispatcher->dispatch('string eventName', $eventInstance); 

的$ eventInstance在这种情况下,通过使用一个类创建扩展了Symfony\Component\EventDispatcher\Event课程。

您可以将任何类型的面向对象的结构添加到Event类,就像其他类或属性(如LifeCycleEventArgs)并将其与getter和setter(getLifeCycleEventArgs(),setLifeCycleEventArgs())一起使用。

我会在你的情况下扩展任何侦听器期望的类,并添加你需要的任何参数,并根据优先级添加另一个在其之前或之后触发的侦听器。

+0

感谢您的回复! :)事情是监听器当前设置为从Doctrine侦听preRemove事件。这意味着它期待一个'LifecycleEventArgs' - 而不是一个自定义事件 - 如果没有软删除,这是完全正确的。我真的很想模仿从Doctrine抛出的事件,所以我的听众可以透明地处理删除和软删除。 – Azuli42 2015-02-10 13:39:23

+1

我明白了,在这种情况下,您应该使用\ Doctrine \ Common \ EventManager来注册并监听事件。 http://doctrine-orm.readthedocs.org/en/latest/reference/events.html#the-event-system拥有更多信息。 – MichaelHindley 2015-02-10 14:06:16