Это первый раз, когда я работаю над созданием пользовательского диспетчера событий и подписчика, поэтому я пытаюсь обернуть его вокруг, и я не могу понять, почему мое пользовательское событие не отправляется.
Я следую за документация и в моем случае мне нужно отправить событие, как только кто-то зарегистрируется на сайте.
так внутри моего registerAction()
Я пытаюсь отправить событие как это
$dispatcher = new EventDispatcher();
$event = new RegistrationEvent($user);
$dispatcher->dispatch(RegistrationEvent::NAME, $event);
Это мое RegistrationEvent
учебный класс
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
учебный класс
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););
}
}
Дубликат диспетчер не отправляет мое событие symfony
С авто-проводкой теперь лучше вводить 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);
}
}