[Serializer] Fix collect_denormalization_errors flag in defaultContext #60413
+58
−1
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.
When using the
COLLECT_DENORMALIZATION_ERRORS
flag during denormalization, Symfony should collect all errors and report them together in aPartialDenormalizationException
.Here is an example with two expected errors:
Expected errors
Failed to create object because the class misses the "bar" property.
The data is either not a string, an empty string, or null; you should pass a string that can be parsed with the passed format or a valid DateTime string.
When the flag is passed via the
context
Both errors are correctly collected and returned.
When the flag is set via
default_context
inframework.yaml
:Only one error is returned:
The data is either not a string, an empty string, or null; you should pass a string that can be parsed with the passed format or a valid DateTime string.
#Root Cause
The issue originates in the
\src\Symfony\Component\Serializer\Serializer.php
,function normalize
:The first time this block is hit, it checks for the flag either in $context or $defaultContext. If found, it initializes the error array with:
However, during nested denormalization (e.g., when parsing the
createdAt
field), Symfony re-enters this code path. If the flag was provided viadefaultContext
, it is still present on re-entry. Therefore, thenot_normalizable_value_exceptions
array is reset again, losing the previously collected errors.#My Fix
The fix is to enhance the condition with an additional check to ensure the array of errors is not already initialized:
This ensures the array is only initialized once, preserving previously collected errors in recursive calls, regardless of whether the flag was passed via context or default_context.