@@ -2566,6 +2566,98 @@ of the process. For each, the event class is the event name:
2566
2566
* :class: `Symfony\\ Component\\ Messenger\\ Event\\ WorkerStartedEvent `
2567
2567
* :class: `Symfony\\ Component\\ Messenger\\ Event\\ WorkerStoppedEvent `
2568
2568
2569
+ Message Serializer For Custom Data Formats
2570
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2571
+
2572
+ It is likely that you receive messages from other applications that are not
2573
+ exactly in the format you need. Not all applications will return a JSON message
2574
+ with ``body `` and ``headers `` fields. In this case, you'll need to
2575
+ create a new message serializer. This can be done by implementing the
2576
+ :class: `Symfony\\ Component\\ Messenger\\ Transport\\ Serialization\\ SerializerInterface `.
2577
+ Let's say you want to create a message decoder::
2578
+
2579
+ namespace App\Messenger\Serializer;
2580
+
2581
+ use Symfony\Component\Messenger\Envelope;
2582
+ use Symfony\Component\Messenger\Transport\Serialization\SerializerInterface;
2583
+
2584
+ class MessageWithTokenDecoder implements SerializerInterface
2585
+ {
2586
+ public function decode(array $encodedEnvelope): Envelope
2587
+ {
2588
+ $envelope = \json_decode($encodedEnvelope, true);
2589
+
2590
+ try {
2591
+ // parse the data you received with your custom fields
2592
+ $data = $envelope['data'];
2593
+ $data['token'] = $envelope['token'];
2594
+
2595
+ // other operations like getting information from stamps
2596
+ } catch (\Throwable $throwable) {
2597
+ // wrap any exception that may occur in the envelope to send it to the failure transport
2598
+ return new Envelope($throwable);
2599
+ }
2600
+
2601
+ return new Envelope($data);
2602
+ }
2603
+
2604
+ public function encode(Envelope $envelope): array
2605
+ {
2606
+ // this decoder does not encode messages, but you can implement it by returning
2607
+ // an array with serialized stamps if you need to send messages in a custom format
2608
+ throw new \LogicException('This serializer is only used for decoding messages.');
2609
+ }
2610
+ }
2611
+
2612
+ Now that this serializer is created, you can use it in your transport:
2613
+
2614
+ .. configuration-block ::
2615
+
2616
+ .. code-block :: yaml
2617
+
2618
+ # config/packages/messenger.yaml
2619
+ framework :
2620
+ messenger :
2621
+ transports :
2622
+ my_transport :
2623
+ dsn : ' %env(MY_TRANSPORT_DSN)%'
2624
+ serializer : ' App\Messenger\Serializer\MessageWithTokenDecoder'
2625
+
2626
+ .. code-block :: xml
2627
+
2628
+ <!-- config/packages/messenger.xml -->
2629
+ <?xml version =" 1.0" encoding =" UTF-8" ?>
2630
+ <container xmlns =" http://symfony.com/schema/dic/services"
2631
+ xmlns : xsi =" http://www.w3.org/2001/XMLSchema-instance"
2632
+ xmlns : framework =" http://symfony.com/schema/dic/symfony"
2633
+ xsi : schemaLocation =" http://symfony.com/schema/dic/services
2634
+ https://symfony.com/schema/dic/services/services-1.0.xsd
2635
+ http://symfony.com/schema/dic/symfony
2636
+ https://symfony.com/schema/dic/symfony/symfony-1.0.xsd" >
2637
+
2638
+ <framework : config >
2639
+ <framework : messenger >
2640
+ <framework : transport name =" my_transport" dsn =" %env(MY_TRANSPORT_DSN)%" serializer =" App\Messenger\Serializer\MessageWithTokenDecoder" >
2641
+ <!-- ... -->
2642
+ </framework : transport >
2643
+ </framework : messenger >
2644
+ </framework : config >
2645
+ </container >
2646
+
2647
+ .. code-block :: php
2648
+
2649
+ // config/packages/messenger.php
2650
+ use App\Messenger\Serializer\MessageWithTokenDecoder;
2651
+ use Symfony\Config\FrameworkConfig;
2652
+
2653
+ return static function (FrameworkConfig $framework): void {
2654
+ $messenger = $framework->messenger();
2655
+
2656
+ $messenger->transport('my_transport')
2657
+ ->dsn('%env(MY_TRANSPORT_DSN)%')
2658
+ ->serializer(MessageWithTokenDecoder::class);
2659
+ };
2660
+
2569
2661
Multiple Buses, Command & Event Buses
2570
2662
-------------------------------------
2571
2663
0 commit comments