Как украсить 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