如何在 Symfony 中手动调度 Doctrine/Kernel 事件?
How to manually dispatch Doctrine/Kernel events in Symfony?
我需要手动发送一个 preRemove
事件,因为我正在软删除一个实体,因此并没有真正删除它。但是,我想在实际删除实体时触发相同的侦听器。
我可以像自定义事件那样使用 EventDispatcher
(不需要 LifecycleEventArgs
)吗?派发原版事件的最佳方式是什么?
编辑:
感谢 bosam 的回答,这是手动发送 vanilla 事件的方法:
use Doctrine\ORM\Event\LifecycleEventArgs;
use Doctrine\ORM\Events;
$em = $this->getDoctrine()->getManager();
$eventManager = $em->getEventManager();
$eventManager->dispatchEvent(Events::preRemove, new LifecycleEventArgs($user, $em));
因此,第一个事件不是 "Thrown",而是已调度。你抛出的是异常。
您可以使用 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
class.
的 class 创建的
您可以将任何类型的面向对象的结构添加到事件 class,就像其他 classes 或属性一样,例如 LifeCycleEventArgs 并将其与 getter 和 setter 一起使用(getLifeCycleEventArgs()、setLifeCycleEventArgs ()).
在你的情况下,我会扩展监听器期望的任何事件 class 并添加你需要的任何参数,并添加另一个根据优先级在它之前或之后触发的监听器。
您需要从您的实体管理器实例调用 getEventManager()。
例如学说:
$em = $this->getDoctrine()->getManager();
$eventManager = $em->getEventManager();
然后您可以使用 $eventManager->dispatchEvent($eventName, EventArgs $eventArgs = null)
.
调度事件
我需要手动发送一个 preRemove
事件,因为我正在软删除一个实体,因此并没有真正删除它。但是,我想在实际删除实体时触发相同的侦听器。
我可以像自定义事件那样使用 EventDispatcher
(不需要 LifecycleEventArgs
)吗?派发原版事件的最佳方式是什么?
编辑:
感谢 bosam 的回答,这是手动发送 vanilla 事件的方法:
use Doctrine\ORM\Event\LifecycleEventArgs;
use Doctrine\ORM\Events;
$em = $this->getDoctrine()->getManager();
$eventManager = $em->getEventManager();
$eventManager->dispatchEvent(Events::preRemove, new LifecycleEventArgs($user, $em));
因此,第一个事件不是 "Thrown",而是已调度。你抛出的是异常。
您可以使用 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
class.
您可以将任何类型的面向对象的结构添加到事件 class,就像其他 classes 或属性一样,例如 LifeCycleEventArgs 并将其与 getter 和 setter 一起使用(getLifeCycleEventArgs()、setLifeCycleEventArgs ()).
在你的情况下,我会扩展监听器期望的任何事件 class 并添加你需要的任何参数,并添加另一个根据优先级在它之前或之后触发的监听器。
您需要从您的实体管理器实例调用 getEventManager()。
例如学说:
$em = $this->getDoctrine()->getManager();
$eventManager = $em->getEventManager();
然后您可以使用 $eventManager->dispatchEvent($eventName, EventArgs $eventArgs = null)
.