事件触发后,如何触发发布方法?

时间:2019-08-27 17:03:24

标签: php symfony symfony4 symfony-eventdispatcher

我具有以下事件类定义:

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}

为什么当我按照以下方式调度此类事件时,监听器方法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 个答案:

答案 0 :(得分:1)

更改您的订阅者,使getSubscribedEvents()的显示如下:

public static function getSubscribedEvents(): array
{
    return [CaseEvent::class => 'publish'];
}

这利用了changes on 4.3的优势;在这里,您不再需要指定事件名称,并且使您使用的分派更加简单(单独分派事件对象,并省略事件名)。

您还可以按原样保留订户;并将调度调用更改为“旧样式”:

$this->eventDispatcher->dispatch(new CaseEvent($args), CaseEvent::NAME);

另外,从event_listener中删除services.yaml标签。由于您正在实施EventSubscriberInterface,因此无需添加任何其他配置。