Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork9.7k
[2.8] [Form] Modified iterator_to_array's 2nd parameter to false in ViolationMapper#18747
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Uh oh!
There was an error while loading.Please reload this page.
Conversation
36ff52e tofb920b0Compareissei-m commentedMay 12, 2016
alekitto commentedMay 12, 2016
Yes, you're right, elements are overwritten in the However, the fix was originally submitted to the 2.3 branch, probably that branch is affected from this bug too... |
issei-m commentedMay 12, 2016 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
Great! It's exactly what I want. I will fix soon.
Indeed. I'm also gonna fix target branch. |
fb920b0 tocf520b5Compareissei-m commentedMay 12, 2016 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
issei-m commentedMay 12, 2016
For 2.3:#18761 |
… false in ViolationMapper (issei-m)This PR was squashed before being merged into the 2.3 branch (closes#18761).Discussion----------[2.3] [Form] Modified iterator_to_array's 2nd parameter to false in ViolationMapper| Q | A| ------------- | ---| Branch? | 2.3| Bug fix? | yes| New feature? | no| BC breaks? | no| Deprecations? | no| Tests pass? | yes| Fixed tickets | n/a| License | MIT| Doc PR | n/aFor#18747Commits-------7101cab [2.3] [Form] Modified iterator_to_array's 2nd parameter to false in ViolationMapper
fabpot commentedMay 13, 2016
Thank you@issei-m. |
… false in ViolationMapper (issei-m)This PR was submitted for the 2.8 branch but it was merged into the 2.7 branch instead (closes#18747).Discussion----------[2.8] [Form] Modified iterator_to_array's 2nd parameter to false in ViolationMapper| Q | A| ------------- | ---| Branch? | 2.8| Bug fix? | yes| New feature? | no| BC breaks? | no| Deprecations? | no| Tests pass? | yes| Fixed tickets | n/a| License | MIT| Doc PR | n/aThis bug was introduced in PR#17099. So does not represent in 2.8.2 or older.If we have the following structure form:```php$builder = $formFactory->createBuilder();$form = $builder ->add( $builder->create('person1_name', FormType::class, ['inherit_data' => true]) ->add('first', TextType::class, ['property_path' => '[person1_first_name]']) ->add('last', TextType::class, ['property_path' => '[person1_last_name]']) ) ->add( $builder->create('person2_name', FormType::class, ['inherit_data' => true]) ->add('first', TextType::class, ['property_path' => '[person2_first_name]']) ->add('last', TextType::class, ['property_path' => '[person2_last_name]']) ) ->getForm();```The following mapping for this form doesn't work correctly:```php$mapper = new ViolationMapper();$mapper->mapViolation(new ConstraintViolation('', '', [], null, 'data[person1_first_name]', null), $form);$form['person1_name']['first']->getErrors(); // empty$form->getErrors(); // The violation is mapped to here instead.```## CauseBecause ViolationMapper uses `iterator_to_array` in [here](https://github.com/symfony/symfony/blob/f29d46f29b91ea5c30699cf6bdb8e65545d1dd26/src/Symfony/Component/Form/Extension/Validator/ViolationMapper/ViolationMapper.php#L165) to collect the sub forms.`person1_name` and `person2_name` enable `inherit_data` option. So ViolationMapper will attempt to collect the sub forms of root form like this:```php[ 'first' => Form object, // root.person1_name.first 'last' => Form object, // root.person1_name.last 'first' => Form object, // root.person2_name.first 'last' => Form object, // root.person2_name.last]```As you can see, The name `first` and `last` are used in two places, thus we cannot get result like that.(first/last of person1_name are overwritten by person2_name's)So the violation will finally lost the form where it should map to. It should pass `false` to `iterator_to_array`'s 2nd parameter.Commits-------ae38660 [2.8] [Form] Modified iterator_to_array's 2nd parameter to false in ViolationMapper
Uh oh!
There was an error while loading.Please reload this page.
This bug was introduced in PR#17099. So does not represent in 2.8.2 or older.
If we have the following structure form:
The following mapping for this form doesn't work correctly:
Cause
Because ViolationMapper uses
iterator_to_arrayinhere to collect the sub forms.person1_nameandperson2_nameenableinherit_dataoption. So ViolationMapper will attempt to collect the sub forms of root form like this:As you can see, The name
firstandlastare used in two places, thus we cannot get result like that.(first/last of person1_name are overwritten by person2_name's)
So the violation will finally lost the form where it should map to. It should pass
falsetoiterator_to_array's 2nd parameter.