РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1358 of 1361 menu

Параметр priority атрибута AsMessageHandler

Атрибут AsMessageHandler вешается на класс-обработчик сообщения. Параметр priority задаёт приоритет этого обработчика. Когда на одно сообщение подписано несколько обработчиков, шина сортирует их по убыванию приоритета: сначала вызывается обработчик с наибольшим числом, затем с меньшим. Если параметр не указан, приоритет считается равным нулю.

Синтаксис

#[AsMessageHandler(priority: priority)]

Пример

Давайте создадим сообщение и два обработчика с разным приоритетом. Сообщение будет хранить строку:

<?php namespace App\Message; class ArticleMessage { public function __construct( public string $text, ) { } } ?>

Теперь создадим первый обработчик с приоритетом 10:

<?php namespace App\MessageHandler; use App\Message\ArticleMessage; use Symfony\Component\Messenger\Attribute\AsMessageHandler; #[AsMessageHandler(priority: 10)] class FirstHandler { public function __invoke(ArticleMessage $message): void { echo 'first: ' . $message->text . PHP_EOL; } } ?>

И второй обработчик с приоритетом 5:

<?php namespace App\MessageHandler; use App\Message\ArticleMessage; use Symfony\Component\Messenger\Attribute\AsMessageHandler; #[AsMessageHandler(priority: 5)] class SecondHandler { public function __invoke(ArticleMessage $message): void { echo 'second: ' . $message->text . PHP_EOL; } } ?>

Давайте отправим сообщение через шину из контроллера:

<?php namespace App\Controller; use App\Message\ArticleMessage; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Component\Routing\Attribute\Route; class ArticleController extends AbstractController { #[Route('/article', name: 'article_index')] public function index(MessageBusInterface $bus): Response { $bus->dispatch(new ArticleMessage('abcde')); return new Response('sent'); } } ?>

Результат выполнения кода:

"first: abcde" "second: abcde"

Как видно, обработчик с приоритетом 10 выполнился раньше обработчика с приоритетом 5, несмотря на то, что был объявлен позже.

Пример

Давайте посмотрим, что произойдёт, если поменять приоритеты местами. Первому обработчику поставим 5:

<?php namespace App\MessageHandler; use App\Message\ArticleMessage; use Symfony\Component\Messenger\Attribute\AsMessageHandler; #[AsMessageHandler(priority: 5)] class FirstHandler { public function __invoke(ArticleMessage $message): void { echo 'first: ' . $message->text . PHP_EOL; } } ?>

А второму - 10:

<?php namespace App\MessageHandler; use App\Message\ArticleMessage; use Symfony\Component\Messenger\Attribute\AsMessageHandler; #[AsMessageHandler(priority: 10)] class SecondHandler { public function __invoke(ArticleMessage $message): void { echo 'second: ' . $message->text . PHP_EOL; } } ?>

Результат выполнения кода:

"second: abcde" "first: abcde"

Теперь первым выполнился второй обработчик, так как его приоритет стал выше.

Пример

Давайте создадим обработчик без параметра priority и обработчик с отрицательным приоритетом -10:

<?php namespace App\MessageHandler; use App\Message\ArticleMessage; use Symfony\Component\Messenger\Attribute\AsMessageHandler; #[AsMessageHandler] class FirstHandler { public function __invoke(ArticleMessage $message): void { echo 'first: ' . $message->text . PHP_EOL; } } ?>

Второй обработчик получит приоритет -10:

<?php namespace App\MessageHandler; use App\Message\ArticleMessage; use Symfony\Component\Messenger\Attribute\AsMessageHandler; #[AsMessageHandler(priority: -10)] class SecondHandler { public function __invoke(ArticleMessage $message): void { echo 'second: ' . $message->text . PHP_EOL; } } ?>

Результат выполнения кода:

"first: abcde" "second: abcde"

Обработчик без priority имеет приоритет 0, поэтому он выполнился раньше обработчика с -10.

Смотрите также

  • атрибут AsMessageHandler,
    который помечает класс как обработчик сообщений
  • параметр handles,
    который задаёт обрабатываемое сообщение
  • параметр bus,
    который привязывает обработчик к конкретной шине
  • класс MessageBus,
    который отправляет сообщения обработчикам
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить