如何在 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).

调度事件