You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
finalreadonlyclass SearchDto
{
public ?bool$restricted = null;
}
finalclass MyController
{
#[Route(name: 'search', path: '/search')]
publicfunction__invoke(#[MapQueryString] SearchDto$search): Response
{
// /search?restricted=// "false" would be converted to true
}
}
Other conversions work.
Applying a serialization context with the FILTER_BOOL flag aren't working too.
This also might be related to #57487.
Possible Solution
Looks like the applyFilterBool function is not called within AbstractNormalizer, if no constructor is given. Other assertions / convertions seems to work in DTOs, even if no constructor given.
Additional Context
Not using constructor works for all other use cases I've tested. With constructor we had issues with enums, why we used the solution like here
The text was updated successfully, but these errors were encountered:
…R_BOOL is set (Maximilian Zumbansen)
This PR was squashed before being merged into the 7.1 branch.
Discussion
----------
[Serializer] [ObjectNormalizer] Use bool filter when FILTER_BOOL is set
| Q | A
| ------------- | ---
| Branch? | 7.1 <!-- see below -->
| Bug fix? | yes
| New feature? | no <!-- please update src/**/CHANGELOG.md files -->
| Deprecations? | no <!-- please update UPGRADE-*.md and src/**/CHANGELOG.md files -->
| Issues | Fix#57540 <!-- prefix each issue number with "Fix #", no need to create an issue if none exists, explain below instead -->
| License | MIT
With 7.1 it is possible to map query booleans to php bool parameters (https://symfony.com/blog/new-in-symfony-7-1-misc-improvements-part-3#mapping-boolean-query-string-parameters). But as we found out, this only works when the DTO is initialized via `construct`. Otherwise the `FILTER_BOOL` flag will be ignored and e.g. "false" will be deserialized as `true`.
To fix this, I suggest to look for the `FILTER_BOOL` in the context and apply the filter, when the type is `bool` and the data is `string`.
Commits
-------
6e657e8 [Serializer] [ObjectNormalizer] Use bool filter when FILTER_BOOL is set
Symfony version(s) affected
7.1
Description
Recently, with #54153 , support for boolean values on DTOs have been added within the
#[MapQueryString]
.I recently ran into an issue, where the paramter value
false
was mistakenly interpreted astrue
.How to reproduce
While this works:
This doesn't work:
Other conversions work.
Applying a serialization context with the
FILTER_BOOL
flag aren't working too.This also might be related to #57487.
Possible Solution
Looks like the
applyFilterBool
function is not called withinAbstractNormalizer
, if no constructor is given. Other assertions / convertions seems to work in DTOs, even if no constructor given.Additional Context
Not using constructor works for all other use cases I've tested. With constructor we had issues with enums, why we used the solution like here
The text was updated successfully, but these errors were encountered: