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