Новое в Symfony 7.2: Атрибут AsMessage
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, конфигурация всегда имеет приоритет над атрибутом класса. Такое поведение позволяет вам переопределить маршрутизацию в зависимости от окружения.