Отримання результатів з вашого обробника

Дата оновлення перекладу 2022-11-22

Отримання результатів з вашого обробника

Коли повідомлення обробляєть, 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(MessageBusInterface $messageBus)
    {
        $this->messageBus = $messageBus;
    }

    public function __invoke()
    {
        $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(MessageBusInterface $messageBus)
    {
        $this->messageBus = $messageBus;
    }

    /**
     * @param object|Envelope $query
     *
     * @return mixed The handler returned value
     */
    public function query($query)
    {
        return $this->handle($query);
    }
}