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