Как я могу запустить метод публикации после запуска события?

У меня есть следующее определение класса событий:

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Вам не нужно добавлять какие-либо другие настройки.

Другие вопросы по тегам