diff --git a/src/Symfony/Component/Form/Extension/Validator/Constraints/FormValidator.php b/src/Symfony/Component/Form/Extension/Validator/Constraints/FormValidator.php index b0deef7f04e50..fc50af4d01d94 100644 --- a/src/Symfony/Component/Form/Extension/Validator/Constraints/FormValidator.php +++ b/src/Symfony/Component/Form/Extension/Validator/Constraints/FormValidator.php @@ -110,7 +110,7 @@ public function validate($form, Constraint $formConstraint) foreach ($constraints as $constraint) { // For the "Valid" constraint, validate the data in all groups if ($constraint instanceof Valid) { - if (\is_object($data)) { + if (\is_object($data) || \is_array($data)) { $validator->atPath('data')->validate($data, $constraint, $groups); } diff --git a/src/Symfony/Component/Form/Tests/Extension/Validator/Constraints/FormValidatorFunctionalTest.php b/src/Symfony/Component/Form/Tests/Extension/Validator/Constraints/FormValidatorFunctionalTest.php index e73947ada3081..35712707b1aca 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Validator/Constraints/FormValidatorFunctionalTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Validator/Constraints/FormValidatorFunctionalTest.php @@ -15,6 +15,7 @@ use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\CallbackTransformer; use Symfony\Component\Form\Exception\TransformationFailedException; +use Symfony\Component\Form\Extension\Core\Type\CollectionType; use Symfony\Component\Form\Extension\Core\Type\DateType; use Symfony\Component\Form\Extension\Core\Type\FormType; use Symfony\Component\Form\Extension\Core\Type\IntegerType; @@ -328,6 +329,35 @@ public function testCascadeValidationToChildFormsWithTwoValidConstraints2() $this->assertSame('children[author].data.email', $violations[1]->getPropertyPath()); } + public function testCascadeValidationToArrayChildForm() + { + $form = $this->formFactory->create(FormType::class, null, [ + 'data_class' => Review::class, + ]) + ->add('title') + ->add('customers', CollectionType::class, [ + 'mapped' => false, + 'entry_type' => CustomerType::class, + 'allow_add' => true, + 'constraints' => [new Valid()], + ]); + + $form->submit([ + 'title' => 'Sample Title', + 'customers' => [ + ['email' => null], + ], + ]); + + $violations = $this->validator->validate($form); + + $this->assertCount(2, $violations); + $this->assertSame('This value should not be blank.', $violations[0]->getMessage()); + $this->assertSame('data.rating', $violations[0]->getPropertyPath()); + $this->assertSame('This value should not be blank.', $violations[1]->getMessage()); + $this->assertSame('children[customers].data[0].email', $violations[1]->getPropertyPath()); + } + public function testCascadeValidationToChildFormsUsingPropertyPathsValidatedInSequence() { $form = $this->formFactory->create(FormType::class, null, [