В моем проекте Symfony у меня есть такая конфигурация в Messenger.yaml: [code]framework: messenger: transports: async: '%env(MESSENGER_TRANSPORT_DSN)%' failed: 'doctrine://default?table_name=failed_messages' sql_channel_manager_dlq: dsn: '%env(SQS_CHANNEL_MANAGER_TRANSPORT_DLQ_DSN)%' options: access_key: '%env(AWS_ACCESS_KEY_ID)%' secret_key: '%env(AWS_SECRET_ACCESS_KEY)%' region: '%env(AWS_REGION)%' queue_name: '%env(CHANNEL_MANAGER_QUEUE_NAME_DLQ)%' sqs_channel_manager: failure_transport: sql_channel_manager_dlq dsn: '%env(SQS_CHANNEL_MANAGER_TRANSPORT_DSN)%' serializer: App\Infrastructure\Messenger\ChannelManagerSerializer options: access_key: '%env(AWS_ACCESS_KEY_ID)%' secret_key: '%env(AWS_SECRET_ACCESS_KEY)%' region: '%env(AWS_REGION)%' queue_name: '%env(CHANNEL_MANAGER_QUEUE_NAME)%' failure_transport: failed default_bus: command.bus buses: event.bus: ~ command.bus: middleware: - 'App\Infrastructure\Middleware\RequestIdMiddleware' routing: App\Message\TestQueue: async App\Domain\Event\ChannelManager\ChannelManagerEventHasReceived: sqs_channel_manager [/code] И мой сериализатор следующий: [code] declare(strict_types=1);
namespace App\Infrastructure\Messenger;
use App\Domain\Event\ChannelManager\ChannelManagerEventHasReceived; use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Stamp\RedeliveryStamp; use Symfony\Component\Messenger\Stamp\TransportMessageIdStamp; use Symfony\Component\Messenger\Transport\Serialization\SerializerInterface;
class ChannelManagerSerializer implements SerializerInterface { public function decode(array $encodedEnvelope): Envelope { $data = json_decode($encodedEnvelope['body'], true);
if (json_last_error() !== JSON_ERROR_NONE) { throw new \InvalidArgumentException( 'Invalid JSON received from SQS: ' . json_last_error_msg() ); }
$envelope = new Envelope(new ChannelManagerEventHasReceived($data));
if (!empty($encodedEnvelope['headers']['stamps'])) { $stamps = unserialize(base64_decode($encodedEnvelope['headers']['stamps'])); foreach ($stamps as $stamp) { $envelope = $envelope->with($stamp); } }
return $envelope; }
public function encode(Envelope $envelope): array { $event = $envelope->getMessage();
$stampsToSerialize = [];
foreach ($envelope->all() as $stampArray) { foreach ($stampArray as $stamp) { if ($stamp instanceof RedeliveryStamp || $stamp instanceof TransportMessageIdStamp) { $stampsToSerialize[] = $stamp; } } }
return [ 'body' => json_encode($event->channelManagerData, JSON_THROW_ON_ERROR), 'headers' => [ 'stamps' => base64_encode(serialize($stampsToSerialize)), ], ]; } } [/code] Я хочу направить ChannelManagerEventHasReceived на шину event.bus. Как мне этого добиться?