Symfony事件订阅者不响应调度

时间:2019-01-28 09:42:42

标签: php symfony events listener

我正在使用带有自动接线调度程序的服务来调度事件。为了测试事件,我在调度事件之前添加了一个事件订阅者。但是,注册订户没有记录我希望它执行的方法。

事件:

<?php

namespace App\Event;

use Symfony\Component\EventDispatcher\Event;

class GameStartEvent extends Event {

}

订户:

<?php

namespace App\Event;

use Psr\Log\LoggerAwareTrait;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class GameStartSubscriber implements EventSubscriberInterface {

    use LoggerAwareTrait;

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

    public static function getSubscribedEvents() {
        return [
            "game.started" => [
                [
                    'logEvent',
                ],
            ]
        ];
    }

    public function logEvent(GameStartEvent $event): void {
        $this->logger->info("the game has started");
    }
}

这是使用过的服务,该服务应该在将来应该在其他地方进行事件注册时调度事件。我只是在这里做测试:

<?php

namespace App\Service;

use App\Event\GameStartEvent;
use App\Event\GameStartSubscriber;
use Psr\Log\LoggerInterface;
use Psr\SimpleCache\CacheInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;

class GameCacheService {

    private $eventDispatcher;

    private $logger;

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

    // some other methods...

    function startGame() {
        // some code...

        $gameStartSubscriber = new GameStartSubscriber($this->logger);
        $this->eventDispatcher->addSubscriber($gameStartSubscriber);

        $this->eventDispatcher->dispatch("game.started", new GameStartEvent());   
    }
}

调用服务方法后,未记录指定的记录器消息。

1 个答案:

答案 0 :(得分:2)

更换 $ this-> eventDispatcher-> dispatch(“ game.started”,new GameStartEvent());` 与 $ this-> eventDispatcher-> dispatch(“ game.started”,$ event);`

您似乎至少在App/Entity中拥有您的事件,该事件默认情况下不会自动连线,因此不应。看一下您的services.yml,应该将其排除在自动装配之外。将您的内容移至类似App/Event

的位置