Как украсить MessageBus с помощью функции handle, как в HandleTrait

Я хочу украсить мою шину запросов 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 или как украсить существующий автобус?

Спасибо <3

0 ответов

Другие вопросы по тегам