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

2024-01-06

我按照 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',
            ]);
    }
}

我设置了一个订阅者来监听事件并记录日志。为了确保订阅者正常工作,我还订阅了一个内核事件(有效):

namespace App\EventSubscriber;

use App\Event\TestEvent;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\KernelEvents;

class TestSubscriber implements EventSubscriberInterface
{
    private $logger;

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

    public static function getSubscribedEvents()
    {
        return [
            TestEvent::NAME => [['onTestEvent', 20]],
            KernelEvents::REQUEST => 'onKernelRequest',
        ];
    }

    public function onTestEvent(TestEvent $event)
    {
        $this->logger->info('Subscriber says: Found test event');
        $this->logger->info('Subscriber says: Test event posted this data {data}', [
            'data' => $event->getData(),
        ]);
    }

    public function onKernelRequest()
    {
        $this->logger->info('Got Kernel Request');
    }
}

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

根据文档,我跑了

php bin/console debug:event-dispatcher test.event

在控制台并得到

注册“test.event”事件的监听器


订单可调用优先级


#1 应用\EventSubscriber\TestSubscriber::onTestEvent() 20


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

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

Thanks!


在 symfony 4.3 中,如果你像这样调度事件$this->eventDispatcher->dispatch($event);调度员使用方法get_class($event)作为事件名称,因此在您的订阅者中您需要更改

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

to

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

对于听众使用这个:

App\Event\TestListener:
        tags:
            - { 'name': 'kernel.event_listener', 'event': 'App\Event\TestEvent', 'method': 'onTestEvent' }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Symfony 4 自定义事件调度程序不工作 的相关文章

随机推荐