Skip to content

Commit 225b449

Browse files
committed
Merge branch '4.4' into 5.1
* 4.4: [Messenger] StopWorkersCommand improve doc helper Added compatibility with PHPunit 9.5 do not apply the Valid constraint on scalar form data [Test] Reproduce issue with cascading validation [SecurityBundle] Don't use the container as resource type in fixtures. Fix bug with whitespace in Kernel::stripComments()
2 parents 56847a7 + 77b8d68 commit 225b449

File tree

2 files changed

+97
-1
lines changed

2 files changed

+97
-1
lines changed

Extension/Validator/Constraints/FormValidator.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,9 @@ public function validate($form, Constraint $formConstraint)
110110
foreach ($constraints as $constraint) {
111111
// For the "Valid" constraint, validate the data in all groups
112112
if ($constraint instanceof Valid) {
113-
$validator->atPath('data')->validate($data, $constraint, $groups);
113+
if (\is_object($data)) {
114+
$validator->atPath('data')->validate($data, $constraint, $groups);
115+
}
114116

115117
continue;
116118
}

Tests/Extension/Validator/Constraints/FormValidatorFunctionalTest.php

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use Symfony\Component\Form\Exception\TransformationFailedException;
1818
use Symfony\Component\Form\Extension\Core\Type\DateType;
1919
use Symfony\Component\Form\Extension\Core\Type\FormType;
20+
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
2021
use Symfony\Component\Form\Extension\Core\Type\TextType;
2122
use Symfony\Component\Form\Extension\Validator\ValidatorExtension;
2223
use Symfony\Component\Form\FormBuilderInterface;
@@ -27,6 +28,7 @@
2728
use Symfony\Component\Validator\Constraints\GroupSequence;
2829
use Symfony\Component\Validator\Constraints\Length;
2930
use Symfony\Component\Validator\Constraints\NotBlank;
31+
use Symfony\Component\Validator\Constraints\Valid;
3032
use Symfony\Component\Validator\Mapping\ClassMetadata;
3133
use Symfony\Component\Validator\Mapping\Factory\LazyLoadingMetadataFactory;
3234
use Symfony\Component\Validator\Mapping\Loader\StaticMethodLoader;
@@ -290,6 +292,39 @@ public function testCascadeValidationToChildFormsUsingPropertyPaths()
290292
$this->assertSame('children[field2].data', $violations[1]->getPropertyPath());
291293
}
292294

295+
public function testCascadeValidationToChildFormsWithTwoValidConstraints()
296+
{
297+
$form = $this->formFactory->create(ReviewType::class);
298+
299+
$form->submit([
300+
'rating' => 1,
301+
'title' => 'Sample Title',
302+
]);
303+
304+
$violations = $this->validator->validate($form);
305+
306+
$this->assertCount(1, $violations);
307+
$this->assertSame('This value should not be blank.', $violations[0]->getMessage());
308+
$this->assertSame('children[author].data.email', $violations[0]->getPropertyPath());
309+
}
310+
311+
public function testCascadeValidationToChildFormsWithTwoValidConstraints2()
312+
{
313+
$form = $this->formFactory->create(ReviewType::class);
314+
315+
$form->submit([
316+
'title' => 'Sample Title',
317+
]);
318+
319+
$violations = $this->validator->validate($form);
320+
321+
$this->assertCount(2, $violations);
322+
$this->assertSame('This value should not be blank.', $violations[0]->getMessage());
323+
$this->assertSame('data.rating', $violations[0]->getPropertyPath());
324+
$this->assertSame('This value should not be blank.', $violations[1]->getMessage());
325+
$this->assertSame('children[author].data.email', $violations[1]->getPropertyPath());
326+
}
327+
293328
public function testCascadeValidationToChildFormsUsingPropertyPathsValidatedInSequence()
294329
{
295330
$form = $this->formFactory->create(FormType::class, null, [
@@ -448,3 +483,62 @@ public function configureOptions(OptionsResolver $resolver)
448483
$resolver->setDefault('data_class', Foo::class);
449484
}
450485
}
486+
487+
class Review
488+
{
489+
public $rating;
490+
public $title;
491+
public $author;
492+
493+
public static function loadValidatorMetadata(ClassMetadata $metadata)
494+
{
495+
$metadata->addPropertyConstraint('title', new NotBlank());
496+
$metadata->addPropertyConstraint('rating', new NotBlank());
497+
}
498+
}
499+
500+
class ReviewType extends AbstractType
501+
{
502+
public function buildForm(FormBuilderInterface $builder, array $options)
503+
{
504+
$builder
505+
->add('rating', IntegerType::class, [
506+
'constraints' => [new Valid()],
507+
])
508+
->add('title')
509+
->add('author', CustomerType::class, [
510+
'constraints' => [new Valid()],
511+
])
512+
;
513+
}
514+
515+
public function configureOptions(OptionsResolver $resolver)
516+
{
517+
$resolver->setDefault('data_class', Review::class);
518+
}
519+
}
520+
521+
class Customer
522+
{
523+
public $email;
524+
525+
public static function loadValidatorMetadata(ClassMetadata $metadata)
526+
{
527+
$metadata->addPropertyConstraint('email', new NotBlank());
528+
}
529+
}
530+
531+
class CustomerType extends AbstractType
532+
{
533+
public function buildForm(FormBuilderInterface $builder, array $options)
534+
{
535+
$builder
536+
->add('email')
537+
;
538+
}
539+
540+
public function configureOptions(OptionsResolver $resolver)
541+
{
542+
$resolver->setDefault('data_class', Customer::class);
543+
}
544+
}

0 commit comments

Comments
 (0)