Symfony 4自定义事件调度程序不工作

Symfony 4自定义事件调度程序不工作,symfony,events,symfony4,Symfony,Events,Symfony4,我遵循Symfony 4.3文档创建了一个自定义事件,发送它,并监听它。跟踪控制器的执行,事件调度器似乎找不到任何订阅者,我无法找出我做错了什么 我的事件类非常基本: namespace App\Event; use Symfony\Contracts\EventDispatcher\Event; class TestEvent extends Event { public const NAME = 'test.event'; protected $data; p

我遵循Symfony 4.3文档创建了一个自定义事件,发送它,并监听它。跟踪控制器的执行,事件调度器似乎找不到任何订阅者,我无法找出我做错了什么

我的事件类非常基本:

namespace App\Event;

use Symfony\Contracts\EventDispatcher\Event;

class TestEvent extends Event
{
    public const NAME = 'test.event';

    protected $data;

    public function __construct(string $data)
    {
        $this->data = $data;
    }

    public function getData(): string
    {
        return $this->data;
    }
}
我的控制器实例化并分派事件:

class TestController extends AbstractController
{
    private $eventDispatcher;

    public function __construct(EventDispatcherInterface $eventDispatcher, LoggerInterface $logger)
    {
        $this->eventDispatcher = $eventDispatcher;
    }

    /**
     * @Route("/event", name="event_test")
     */
    public function eventTest()
    {
        $event = new TestEvent('Event string');
        $this->eventDispatcher->dispatch($event);

        return $this->render('Test/TestEvent.html.twig', [
            'title' => 'Test Event',
            ]);
    }
}
我设置了一个订阅服务器来侦听事件并记录日志。为了确保订阅服务器正常工作,我还订阅了一个内核事件(可以正常工作):

当我访问/event URL时,我看到了预期的输出,日志显示了内核请求,但没有显示test.event日志

根据文件,我跑了

php bin/console debug:event-dispatcher test.event
在控制台上

“test.event”事件的已注册侦听器
订单可调用优先级


#1 App\EventSubscriber\TestSubscriber::onTestEvent()20


这告诉我订户已注册,但由于某种原因,它没有被调用。任何帮助都会很棒

(顺便说一句,我也尝试了一个事件监听器,得到了相同的结果。)


谢谢

在symfony 4.3中,如果您像这样调度事件
$this->eventDispatcher->dispatch($event)
dispather使用方法
get\u class($event)
作为事件名称,因此在订阅服务器中需要更改

TestEvent::NAME => [['onTestEvent', 20]],

对于侦听器,请使用以下命令:

App\Event\TestListener:
        tags:
            - { 'name': 'kernel.event_listener', 'event': 'App\Event\TestEvent', 'method': 'onTestEvent' }

为什么控制台显示notify而不是onTestEvent?@Cerad很好,在撰写此问题时,我将函数名从“notify”更改为“onTestEvent”。我发布的控制台输出是旧的。我已经更新了输出。太棒了!这就像一个符咒,但要在控制台中看到注册的侦听器,我必须按类名(php-bin/console-debug:event-dispatcher“App\event\TestEvent”)。$dispatcher->dispatch($event,TestEvent::name);也会使您的原始代码正常工作。是的,但这是一种古老的方式,很快就会被弃用。旧方法是将$eventName作为第一个参数传递。该方法在4.3中已被折旧。现在支持将$eventName作为第二个参数传递,并将继续这样做。请注意,即使在4.3中,各种内核事件仍然使用诸如kernel.request之类的名称。我并不反对使用类名而不是事件名,但这两种方法都得到了充分的支持,并将继续得到支持。作为记录,在第二个参数中使用事件名进行调度并订阅名称,正如Cerad所说,正如@IhorKostrov所说的那样,在我的测试中工作,没有名字的分派和订阅类。
TestEvent::class=> [['onTestEvent', 20]],
App\Event\TestListener:
        tags:
            - { 'name': 'kernel.event_listener', 'event': 'App\Event\TestEvent', 'method': 'onTestEvent' }