Подписчик событий Symfony не реагирует на рассылку - PullRequest
0 голосов
/ 28 января 2019

Я использую службу с автоматическим проводным диспетчером для отправки события.Чтобы протестировать события, я добавил подписчика непосредственно перед отправкой события.Однако зарегистрированный подписчик не регистрирует метод, который я ожидал бы сделать.

Событие:

<?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 голосов
/ 28 января 2019
Замените `$ this-> eventDispatcher-> dispatch (" game.started ", new GameStartEvent ());` на `$ this-> eventDispatcher-> dispatch (" game.started ", $ event);`

Похоже, у вас есть хотя бы ваше событие в App/Entity, которое по умолчанию не подключено автоматически и не должно быть.Взгляните на ваш services.yml, он должен быть исключен из Autowiring.Переместите ваши вещи к чему-то вроде App/Event

...