Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在Symfony中手动分派条令/内核事件?_Php_Symfony_Orm_Doctrine Orm_Doctrine - Fatal编程技术网

Php 如何在Symfony中手动分派条令/内核事件?

Php 如何在Symfony中手动分派条令/内核事件?,php,symfony,orm,doctrine-orm,doctrine,Php,Symfony,Orm,Doctrine Orm,Doctrine,我需要手动调度一个预删除事件,因为我正在软删除一个实体,因此没有真正删除它。但是,我希望在实体实际被删除时触发相同的侦听器 我可以像自定义事件一样使用EventDispatcher(它不需要LifecycleEventArgs)吗?发送普通活动的最佳方式是什么 编辑: 感谢bosam answer,这是手动调度普通事件的方法: use Doctrine\ORM\Event\LifecycleEventArgs; use Doctrine\ORM\Events; $em = $this->

我需要手动调度一个
预删除
事件,因为我正在软删除一个实体,因此没有真正删除它。但是,我希望在实体实际被删除时触发相同的侦听器

我可以像自定义事件一样使用
EventDispatcher
(它不需要
LifecycleEventArgs
)吗?发送普通活动的最佳方式是什么

编辑:

感谢bosam answer,这是手动调度普通事件的方法:

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

$em = $this->getDoctrine()->getManager();
$eventManager = $em->getEventManager();
$eventManager->dispatchEvent(Events::preRemove, new LifecycleEventArgs($user, $em));
因此,第一个事件不是“抛出”,而是分派。你抛出的是异常

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

有关更多详细信息,请在此处阅读有关调度事件的内容:

此外,您还可以通过以下方式分派任何事件:

$dispatcher = $this->get('event_dispatcher');
$dispatcher->dispatch('string eventName', $eventInstance);
在本例中,$eventInstance是通过使用扩展
Symfony\Component\EventDispatcher\Event
类的类创建的

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


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

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

例如,对于学说:

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

然后,您可以使用
$eventManager->dispatchEvent($eventName,EventArgs$EventArgs=null)

发送事件,谢谢您的回复!:)问题是,侦听器当前设置为侦听来自条令的preRemove事件。这意味着它期望的是
生命周期事件args
——而不是自定义事件——如果没有软删除,这是完全正确的。我真的很想模仿Doctrine抛出的事件,这样我的侦听器就可以透明地处理删除和软删除。我明白了,在这种情况下,您应该使用\Doctrine\Common\EventManager来注册和侦听事件。保存更多信息。