Диспетчер не отправляет мое событие symfony

У меня есть класс ExampleListener, который выглядит следующим образом:

<?php

namespace AppBundle\EventListener;

class ExampleListener
{
    public function helloWorld()
    {
        echo "Hello World!";
    }
}

Это мой services.yml

services:
    my.event:
        class: AppBundle\EventListener\ExampleListener
        tags:
            - { name: kernel.event_listener, event: my.event, method: helloWorld }

А потом с контроллера я пытаюсь отправить событие.

$dispatcher = new EventDispatcher();
$dispatcher->dispatch('my.event')

У меня нет никаких ошибок, но функция helloWorld никогда не вызывается. Мое событие истекло:

php bin / console debug: диспетчер событий my.event

результат:

#1      AppBundle\EventListener\ExampleListener::helloWorld()   0

Почему диспетчер не назвал событие правильным? Благодарю.

2 ответа

Решение

Вы создали новый диспетчер событий, который отличается от того, который Symfony использует для регистрации прослушивателей событий, определенных вами в конфигурации вашего контейнера.

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

$this->container->get('event_dispatcher')->dispatch('my.event');

Если вам нужно отправить ваше событие из службы, просто передайте event_dispatcher сервис как один из аргументов конструктора:

services:
    my_service:
        class: Foo\MyService
        arguments:
            - @event_dispatcher

С авто-проводкой теперь лучше вводить 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);
    }
}
Другие вопросы по тегам