[Messenger] Remove non-sendable stamps before calling the serializer's encode method #45098
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
TL;DR; Instead of relying to each implementation of the SeirializerInterface to remove the non-sendable stamps from the envelope, we do it before calling the encode method, to make sure they are not send into the transport(even for a user's custom serializer)
Hello, I came across an issue when having a custom php serializer, I was calling PHP's
serialize
method on the envelope. But serialization was failing with errorSerialization of 'Closure' is not allowed
.The issue was that I was trying to serialize the recently added
\Symfony\Component\Messenger\Stamp\AckStamp
, this class accepts a closure in the constructor and such a class can not be serialized form PHP's nativeserialize
method. It turns out that this class should not be serialized and we should remove the stamps that implement the interface\Symfony\Component\Messenger\Stamp\NonSendableStampInterface
by doing that before serializing the message:Both of messenger's serializers
\Symfony\Component\Messenger\Transport\Serialization\PhpSerializer
and\Symfony\Component\Messenger\Transport\Serialization\Serializer
make the above call towithoutStampsOfType
before serializing an envelope.Which got me thinking that it would have been nice if messenger was removing the stamps that implement
\Symfony\Component\Messenger\Stamp\NonSendableStampInterface
before passing the envelope to be encoded to the given serializer. My solution was to create a SerializerDecorator that removes the stamps and calls the serializer that has been provided to the given transport.This solution makes the behavior consistent with native messenger's serializers and the custom serializers of the users. If a user calls
withoutStampsOfType
method on its own implementation there will be no error, so no BC break.Thank you