Как я могу запустить метод публикации после запуска события?
У меня есть следующее определение класса событий:
use Symfony\Contracts\EventDispatcher\Event;
class CaseEvent extends Event
{
public const NAME = 'case.event';
// ...
}
И я создал подписчика следующим образом:
use App\Event\CaseEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class CaseEventListener implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [CaseEvent::NAME => 'publish'];
}
public function publish(CaseEvent $event): void
{
// do something
}
}
Я также определил следующее в services.yaml
:
App\EventSubscriber\CaseEventListener:
tags:
- { name: kernel.event_listener, event: case.event}
Почему, когда я отправляю такое событие как метод listener publish()
никогда не выполняется?
/**
* Added here for visibility but is initialized in the class constructor
*
* @var EventDispatcherInterface
*/
private $eventDispatcher;
$this->eventDispatcher->dispatch(new CaseEvent($args));
Я подозреваю, что проблема в kernel.event_listener
но не уверен, как правильно подписать слушателя на событие.
1 ответ
Измените своего подписчика так getSubscribedEvents()
читается так:
public static function getSubscribedEvents(): array
{
return [CaseEvent::class => 'publish'];
}
Это использует изменения на 4.3; где вам больше не нужно указывать имя события, и это упрощает используемую вами диспетчеризацию (отправление объекта события само по себе и пропуск имени события).
Вы могли бы также оставить своего подписчика, как это было; и измените диспетчерский вызов на "старый стиль":
$this->eventDispatcher->dispatch(new CaseEvent($args), CaseEvent::NAME);
Кроме того, удалите event_listener
теги от services.yaml
, Поскольку вы реализуете EventSubscriberInterface
Вам не нужно добавлять какие-либо другие настройки.