Symfony - Событие не отправляется

Это первый раз, когда я работаю над созданием пользовательского диспетчера событий и подписчика, поэтому я пытаюсь обернуть его вокруг и не могу понять, почему мое пользовательское событие не отправляется.

Я слежу за документацией, и в моем случае мне нужно отправить событие, как только кто-то зарегистрируется на сайте.

так внутри моего 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}

На вкладке "Событие" в профилировщике я вижу свое пользовательское событие в списке, но оно по-прежнему не отправляется.

2 ответа

Решение

Создавая свой собственный 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);
    }
}
Другие вопросы по тегам