Отримання результатів з вашого обробника
Дата оновлення перекладу 2024-05-29
Отримання результатів з вашого обробника
Коли повідомлення обробляєть, HandleMessageMiddleware додає HandledStamp для кожного обʼєкта, який обробляв повідомлення. Ви можете використати це, щоб отримати значення, повернене оборбником(ами):
1 2 3 4 5 6 7 8 9 10 11
use Symfony\Component\Messenger\MessageBusInterface;
use Symfony\Component\Messenger\Stamp\HandledStamp;
$envelope = $messageBus->dispatch(new SomeMessage());
// отримати значення, яке було повернене останнім оборбником повідомлення
$handledStamp = $envelope->last(HandledStamp::class);
$handledStamp->getResult();
// або отримати інформацію про всі інші обробники
$handledStamps = $envelope->all(HandledStamp::class);
Робота з автобусами команд і запитів
Компонент Месенджер може бути використаний в CQRS-архітектурах, де автобуси команд і запитів є центральними елементами додатку. Прочитайте статтю про CQRS від Мартіна Фоулера, щоб дізнатися більше про те, як сконфігурувати декілька автобусів.
Так як запити зазвичай є синхронними і частіше за все обробляються один раз, отримання результатів з обробника - розповсюджена потреба.
HandleTrait існує для отримання результату обробника
при сихнронній обробці. Він також гарантує, що буде зареєстрований лише один обробник.
HandleTrait
може бути використаний у будь-якому класі, який має властивість $messageBus
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
// src/Action/ListItems.php
namespace App\Action;
use App\Message\ListItemsQuery;
use App\MessageHandler\ListItemsQueryResult;
use Symfony\Component\Messenger\HandleTrait;
use Symfony\Component\Messenger\MessageBusInterface;
class ListItems
{
use HandleTrait;
public function __construct(
private MessageBusInterface $messageBus,
) {
}
public function __invoke(): void
{
$result = $this->query(new ListItemsQuery(/* ... */));
// зробити щось з результатом
// ...
}
// Створення такого методу необовʼязкове, але дозволяє додавати підказки у результат
private function query(ListItemsQuery $query): ListItemsQueryResult
{
return $this->handle($query);
}
}
Таким чином, ви можете використати цю якість для створення класів автобусів команд і
запитів. Наприклад, ви можете створити спеціальний клас QueryBus
і впровадити його
там, де вам потрібна поведінка автобусу запитів, замість MessageBusInterface
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
// src/MessageBus/QueryBus.php
namespace App\MessageBus;
use Symfony\Component\Messenger\Envelope;
use Symfony\Component\Messenger\HandleTrait;
use Symfony\Component\Messenger\MessageBusInterface;
class QueryBus
{
use HandleTrait;
public function __construct(
private MessageBusInterface $messageBus,
) {
}
/**
* @param object|Envelope $query
*
* @return mixed The handler returned value
*/
public function query($query): mixed
{
return $this->handle($query);
}
}