Symfony - 事件未被发送
Symfony - Event not being dispatched
这是我第一次创建自定义事件调度程序和订阅者,所以我想全神贯注,但我似乎无法找出为什么我的自定义事件没有被调度。
我正在关注 documentation,就我而言,我需要在有人在网站上注册后立即发送一个事件。
所以在我的 registerAction()
中,我正在尝试发送这样的事件
$dispatcher = new EventDispatcher();
$event = new RegistrationEvent($user);
$dispatcher->dispatch(RegistrationEvent::NAME, $event);
这是我的RegistrationEvent
class
namespace AppBundle\Event;
use AppBundle\Entity\User;
use Symfony\Component\EventDispatcher\Event;
class RegistrationEvent extends Event
{
const NAME = 'registration.complete';
protected $user;
public function __construct(User $user)
{
$this->user = $user;
}
public function getUser(){
return $this->user;
}
}
这是我的RegistrationSubscriber
class
namespace AppBundle\Event;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class RegistrationSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return array(
KernelEvents::RESPONSE => array(
array('onKernelResponsePre', 10),
array('onKernelResponsePost', -10),
),
RegistrationEvent::NAME => 'onRegistration'
);
}
public function onKernelResponsePre(FilterResponseEvent $event)
{
// ...
}
public function onKernelResponsePost(FilterResponseEvent $event)
{
// ...
}
public function onRegistration(RegistrationEvent $event){
var_dump($event);
die;
}
}
执行此操作后,我希望注册过程会在函数 onRegistration
处停止,但那没有发生,然后我查看了分析器的“事件”选项卡,但没有看到我的事件列出他们的任一个。
我在这里错过了什么?向正确的方向推动将不胜感激。
更新:
我想我需要为自定义事件注册一个服务,所以我在 services.yml
中添加了以下代码
app.successfull_registration_subscriber:
class: AppBundle\Event\RegistrationSubscriber
arguments: ["@doctrine.orm.entity_manager"]
tags:
- { name: kernel.event_subscriber}
在探查器的“事件”选项卡中,我确实看到我的自定义事件被列出,但它仍然没有调度。
通过创建您自己的 EventDispatcher
实例,您可以调度一个永远不会被其他侦听器侦听的事件(它们不附加到此调度程序实例)。您需要使用 event_dispatcher
服务来通知您使用 kernel.event_listener
和 kernel.event_subscriber
标签标记的所有听众:
// ...
class RegistrationController extends Controller
{
public function registerAction()
{
// ...
$this->get('event_dispatcher')->dispatch(RegistrationEvent::NAME, new RegistrationEvent($user););
}
}
的副本
有了自动装配,现在最好注入 EventDispatcherInterface
<?php
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
//...
class DefaultController extends Controller
{
public function display(Request $request, EventDispatcherInterface $dispatcher)
{
//Define your event
$event = new YourEvent($request);
$dispatcher->dispatch(YourEvent::EVENT_TO_DISPATCH, $event);
}
}
这是我第一次创建自定义事件调度程序和订阅者,所以我想全神贯注,但我似乎无法找出为什么我的自定义事件没有被调度。
我正在关注 documentation,就我而言,我需要在有人在网站上注册后立即发送一个事件。
所以在我的 registerAction()
中,我正在尝试发送这样的事件
$dispatcher = new EventDispatcher();
$event = new RegistrationEvent($user);
$dispatcher->dispatch(RegistrationEvent::NAME, $event);
这是我的RegistrationEvent
class
namespace AppBundle\Event;
use AppBundle\Entity\User;
use Symfony\Component\EventDispatcher\Event;
class RegistrationEvent extends Event
{
const NAME = 'registration.complete';
protected $user;
public function __construct(User $user)
{
$this->user = $user;
}
public function getUser(){
return $this->user;
}
}
这是我的RegistrationSubscriber
class
namespace AppBundle\Event;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class RegistrationSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return array(
KernelEvents::RESPONSE => array(
array('onKernelResponsePre', 10),
array('onKernelResponsePost', -10),
),
RegistrationEvent::NAME => 'onRegistration'
);
}
public function onKernelResponsePre(FilterResponseEvent $event)
{
// ...
}
public function onKernelResponsePost(FilterResponseEvent $event)
{
// ...
}
public function onRegistration(RegistrationEvent $event){
var_dump($event);
die;
}
}
执行此操作后,我希望注册过程会在函数 onRegistration
处停止,但那没有发生,然后我查看了分析器的“事件”选项卡,但没有看到我的事件列出他们的任一个。
我在这里错过了什么?向正确的方向推动将不胜感激。
更新:
我想我需要为自定义事件注册一个服务,所以我在 services.yml
app.successfull_registration_subscriber:
class: AppBundle\Event\RegistrationSubscriber
arguments: ["@doctrine.orm.entity_manager"]
tags:
- { name: kernel.event_subscriber}
在探查器的“事件”选项卡中,我确实看到我的自定义事件被列出,但它仍然没有调度。
通过创建您自己的 EventDispatcher
实例,您可以调度一个永远不会被其他侦听器侦听的事件(它们不附加到此调度程序实例)。您需要使用 event_dispatcher
服务来通知您使用 kernel.event_listener
和 kernel.event_subscriber
标签标记的所有听众:
// ...
class RegistrationController extends Controller
{
public function registerAction()
{
// ...
$this->get('event_dispatcher')->dispatch(RegistrationEvent::NAME, new RegistrationEvent($user););
}
}
有了自动装配,现在最好注入 EventDispatcherInterface
<?php
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
//...
class DefaultController extends Controller
{
public function display(Request $request, EventDispatcherInterface $dispatcher)
{
//Define your event
$event = new YourEvent($request);
$dispatcher->dispatch(YourEvent::EVENT_TO_DISPATCH, $event);
}
}