Как украсить MessageBus с помощью функции handle, как в HandleTrait - PullRequest
0 голосов
/ 27 мая 2019

Я хочу украсить мою шину запросов Symfony Messenger функцией handle, чтобы получить результат от обработчика.Это уже реализовано в здесь , но я не хочу использовать эту черту.Я хочу создать свой собственный класс QueryBus с функцией handle, чтобы получить результат, подобный следующему: $result = $this->queryBus->handle(); Я нашел обсуждение этого вопроса: https://github.com/symfony/symfony/issues/29428, но не могу понять, как я могу его украсить.

Я пытался создать свой собственный класс QueryMessenger, но не могу установить его для DI в конфигурации.

Что я пытался:

Мой класс QueryBus:

class QueryBus extends TraceableMessageBus implements MessageBusInterface
{

    public function handle($message)
    {
        $envelope = $this->dispatch($message);
        /** @var HandledStamp[] $handledStamps */
        $handledStamps = $envelope->all(HandledStamp::class);

        if (!$handledStamps) {
            throw new LogicException('..');
        }

        if (\count($handledStamps) > 1) {
            $handlers = implode(', ', array_map(function (HandledStamp $stamp): string {
                return sprintf('"%s"', $stamp->getHandlerAlias() ?? $stamp->getCallableName());
            }, $handledStamps));

            throw new LogicException('..');
        }

        return $handledStamps[0]->getResult();
    }
}

messenger.yaml:

framework:
  messenger:
    default_bus: messenger.bus.commands
    buses:
      messenger.bus.commands:
        middleware:
          - validation
          - doctrine_transaction
      messenger.bus.queries:
        middleware:
          - validation
          - handle_message

services.yaml:

services:
  _defaults:
    autowire: true      
    autoconfigure: true 
    bind:
      $commandBus: '@messenger.bus.commands'
      $queryBus: '@messenger.bus.queries'

пример использования:

class UserEmailExistsValidator extends ConstraintValidator
{
    private $queryBus;

    // Here is the problem.
    public function __construct(QueryBus $queryBus)
    {
        $this->queryBus = $queryBus;
    }

    public function validate($value, Constraint $constraint)
    {
        // ...       
        $result = $this->queryBus->handle(new UserEmailExistsQuery($value)); 
        // ...
    }
}

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

Аргумент 1 передан в App \ User \ Validator \ UserEmailExists \ UserEmailExistsValidator :: __ construct () должен быть экземпляром App \ Common \ Service\ Messenger \ QueryBus, экземпляр данного Symfony \ Component \ Messenger \ TraceableMessageBus, вызванный в /app/var/cache/dev/ContainerWJqzyTi/getUserEmailExistsValidatorService.php в строке 9

Я новичок в SymfonyЯ думаю, я должен установить что-то в конфигурации, но не могу понять, где и что.Итак, как получить собственный класс шины вместо стандартного в конфигурации messenger.bus.queries или как украсить существующую шину?

Thanx <3 </p>

...