8000 bug #49548 [Messenger] Fix `TransportNamesStamp` deserialization (tuc… · symfony/symfony@fd8b883 · GitHub
[go: up one dir, main page]

Skip to content

Commit fd8b883

Browse files
bug #49548 [Messenger] Fix TransportNamesStamp deserialization (tucksaun)
This PR was merged into the 6.2 branch. Discussion ---------- [Messenger] Fix `TransportNamesStamp` deserialization | Q | A | ------------- | --- | Branch? | 6.2 | Bug fix? | yes | New feature? | no | Deprecations? | no | Tickets | #49574, #31490 (comment) | License | MIT | Doc PR | n/a Currently, when ones use `TransportNameStamp` the following exception can occur if they don't use native PHP serialization: ``` In Serializer.php line 125: [Symfony\Component\Messenger\Exception\MessageDecodingFailedException] Could not decode stamp: Cannot create an instance of "Symfony\Component\Messenger\Stamp\TransportNamesStamp" from serialized data because its constructor requires parameter "transports" to be present. In AbstractNormalizer.php line 384: [Symfony\Component\Serializer\Exception\MissingConstructorArgumentsException] Cannot create an instance of "Symfony\Component\Messenger\Stamp\TransportNamesStamp" from serialized data because its constructor requires parameter "transports" to be present. ``` This PR renames `TransportNamesStamp` constructor argument in order to match the accessor method (`getTransportNames`) so that deserialization works when using the Serializer. I know this is technically a (small) BC break but Symfony's BC does not cover named arguments if I remember correctly. Commits ------- 2c7eee0 [Messenger] Fix TransportNamesStamp deserialization
2 parents ac12c4f + 2c7eee0 commit fd8b883

File tree

2 files changed

+26
-3
lines changed

2 files changed

+26
-3
lines changed

src/Symfony/Component/Messenger/Stamp/TransportNamesStamp.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@
1717
final class TransportNamesStamp implements StampInterface
1818
{
1919
/**
20-
* @param string[] $transports Transport names to be used for the message
20+
* @param string[] $transportNames Transport names to be used for the message
2121
*/
22-
public function __construct(private array $transports)
22+
public function __construct(private array $transportNames)
2323
{
2424
}
2525

2626
public function getTransportNames(): array
2727
{
28-
return $this->transports;
28+
return $this->transportNames;
2929
}
3030
}

src/Symfony/Component/Messenger/Tests/Stamp/TransportNamesStampTest.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,13 @@
1212
namespace Symfony\Component\Messenger\Tests\Stamp;
1313

1414
use PHPUnit\Framework\TestCase;
15+
use Symfony\Component\Messenger\Envelope;
1516
use Symfony\Component\Messenger\Stamp\TransportNamesStamp;
17+
use Symfony\Component\Messenger\Transport\Serialization\Serializer;
18+
use Symfony\Component\Serializer\Encoder\JsonEncoder;
19+
use Symfony\Component\Serializer\Normalizer\ArrayDenormalizer;
20+
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
21+
use Symfony\Component\Serializer\Serializer as SymfonySerializer;
1622

1723
class TransportNamesStampTest extends TestCase
1824
{
@@ -27,4 +33,21 @@ public function testGetSenders()
2733
$this->assertSame($sender, $stampSenders[$key]);
2834
}
2935
}
36+
37+
public function testDeserialization()
38+
{
39+
$stamp = new TransportNamesStamp(['foo']);
40+
$serializer = new Serializer(
41+
new SymfonySerializer([
42+
new ArrayDenormalizer(),
43+
new ObjectNormalizer(),
44+
], [new JsonEncoder()])
45+
);
46+
47+
$deserializedEnvelope = $serializer->decode($serializer->encode(new Envelope(new \stdClass(), [$stamp])));
48+
49+
$deserializedStamp = $deserializedEnvelope->last(TransportNamesStamp::class);
50+
$this->assertInstanceOf(TransportNamesStamp::class, $deserializedStamp);
51+
$this->assertEquals($stamp, $deserializedStamp);
52+
}
3053
}

0 commit comments

Comments
 (0)
0