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}

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


person Saadia    schedule 28.04.2016    source источник


Ответы (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););
    }
}
person xabbuh    schedule 28.04.2016
comment
Большое спасибо, это заставило это работать :) теперь, если я правильно понимаю, каждый раз, когда мне нужно отправить пользовательское событие, мне нужно физически писать код снова и снова в разных действиях контроллера или в службах, если ответ на это да, тогда как я могу сделать это событие автоматически доступным для всех слушателей, а не отправлять его вручную? надеюсь мой вопрос имеет смысл - person Saadia; 28.04.2016
comment
Итак, вопрос в том, как ваши слушатели узнают, что событие произошло, если вы его не отправляете? Хотя вам не нужно всегда получать диспетчер событий из контроллера. Например, при настройке ваших сервисов вы можете просто внедрить в него диспетчер событий, как вы используете для внедрения других ваших зависимостей. - person xabbuh; 30.04.2016
comment
Привет, в моем случае выдается ошибка. Служба event_dispatcher не найдена, пожалуйста, помогите мне. - person Pardeep Dhiman; 03.05.2019

Дубликат диспетчер не отправляет мое событие 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);
    }
}
person Laurent    schedule 01.08.2018