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