Новое в Symfony 7.2: Атрибут AsMessage

Источник: «New in Symfony 7.2: AsMessage Attribute»
В Symfony 7.2 представлен новый атрибут AsMessage, позволяющий настраивать транспорт(ы) непосредственно в классе сообщения

Компонент Messenger представляет шину сообщений с возможностью отправки сообщений и их синхронной или асинхронной обработки с помощью транспорта (очередей). Основными элементами Messenger являются сообщения (PHP класс хранящий данные), обработчики (PHP класс вызываемый при отправке поддерживаемых им сообщений) и транспорты (обрабатывающие отправку и отправку сообщений).

Если у вас есть класс сообщений, подобный этому:

// src/Message/SomeNotification.php
namespace App\Message;

class SomeNotification
{
public function __construct(
private string $content,
) {
}

public function getContent(): string
{
return $this->content;
}
}

Предполагая, что вы также определили класс SomeNotificationHandler в приложении, вы можете использовать следующую конфигурацию, чтобы сообщить Symfony, что сообщение должно быть отправлено в транспорт/очередь под названием async:

# config/packages/messenger.yaml
framework:
messenger:
transports:
async: "%env(MESSENGER_TRANSPORT_DSN)%"

routing:
'App\Message\SomeNotification': async

В Symfony 7.2 вводится новый атрибут #[AsMessage], позволяющий настраивать транспорт(ы) непосредственно в классе сообщения. В приведённом выше примере можно удалить конфигурацию routing: в messenger.yaml и добавить в класс сообщения следующее:

#[AsMessage('async')]
class SomeNotification
{
// ...
}

Этот атрибут позволяет передать более одного транспорта в случае, если вы отправляете сообщение на несколько транспортов:

#[AsMessage(['async', 'audit'])]
class SomeNotification

Если вы определяете обе конфигурации YAML/XML и атрибут PHP, конфигурация всегда имеет приоритет над атрибутом класса. Такое поведение позволяет вам переопределить маршрутизацию в зависимости от окружения.

Комментарии


Дополнительные материалы

Предыдущая Статья

Как деструктуризация массивов может замедлить JavaScript код

Следующая Статья

Автоматизация резервного копирования баз данных c Laravel