bug #32037 [Form] validate composite constraints in all groups (xabbuh)
This PR was merged into the 3.4 branch.
Discussion
----------
[Form] validate composite constraints in all groups
| Q | A
| ------------- | ---
| Branch? | 3.4
| Bug fix? | yes
| New feature? | no
| BC breaks? | no
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets | #31990
| License | MIT
| Doc PR |
Commits
-------
94ded00216
validate composite constraints in all groups
This commit is contained in:
commit
575e922964
@ -13,6 +13,7 @@ namespace Symfony\Component\Form\Extension\Validator\Constraints;
|
|||||||
|
|
||||||
use Symfony\Component\Form\FormInterface;
|
use Symfony\Component\Form\FormInterface;
|
||||||
use Symfony\Component\Validator\Constraint;
|
use Symfony\Component\Validator\Constraint;
|
||||||
|
use Symfony\Component\Validator\Constraints\Composite;
|
||||||
use Symfony\Component\Validator\Constraints\GroupSequence;
|
use Symfony\Component\Validator\Constraints\GroupSequence;
|
||||||
use Symfony\Component\Validator\Constraints\Valid;
|
use Symfony\Component\Validator\Constraints\Valid;
|
||||||
use Symfony\Component\Validator\ConstraintValidator;
|
use Symfony\Component\Validator\ConstraintValidator;
|
||||||
@ -90,7 +91,9 @@ class FormValidator extends ConstraintValidator
|
|||||||
$validator->atPath('data')->validate($form->getData(), $constraint, $group);
|
$validator->atPath('data')->validate($form->getData(), $constraint, $group);
|
||||||
|
|
||||||
// Prevent duplicate validation
|
// Prevent duplicate validation
|
||||||
continue 2;
|
if (!$constraint instanceof Composite) {
|
||||||
|
continue 2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,7 @@ use Symfony\Component\Form\FormFactoryInterface;
|
|||||||
use Symfony\Component\Form\FormInterface;
|
use Symfony\Component\Form\FormInterface;
|
||||||
use Symfony\Component\Form\SubmitButtonBuilder;
|
use Symfony\Component\Form\SubmitButtonBuilder;
|
||||||
use Symfony\Component\Translation\IdentityTranslator;
|
use Symfony\Component\Translation\IdentityTranslator;
|
||||||
|
use Symfony\Component\Validator\Constraints\Collection;
|
||||||
use Symfony\Component\Validator\Constraints\GroupSequence;
|
use Symfony\Component\Validator\Constraints\GroupSequence;
|
||||||
use Symfony\Component\Validator\Constraints\NotBlank;
|
use Symfony\Component\Validator\Constraints\NotBlank;
|
||||||
use Symfony\Component\Validator\Constraints\NotNull;
|
use Symfony\Component\Validator\Constraints\NotNull;
|
||||||
@ -673,6 +674,63 @@ class FormValidatorTest extends ConstraintValidatorTestCase
|
|||||||
$this->assertSame($constraint, $context->getViolations()->get(0)->getConstraint());
|
$this->assertSame($constraint, $context->getViolations()->get(0)->getConstraint());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testNonCompositeConstraintValidatedOnce()
|
||||||
|
{
|
||||||
|
$form = $this
|
||||||
|
->getBuilder('form', null, [
|
||||||
|
'constraints' => [new NotBlank(['groups' => ['foo', 'bar']])],
|
||||||
|
'validation_groups' => ['foo', 'bar'],
|
||||||
|
])
|
||||||
|
->setCompound(false)
|
||||||
|
->getForm();
|
||||||
|
$form->submit('');
|
||||||
|
|
||||||
|
$context = new ExecutionContext(Validation::createValidator(), $form, new IdentityTranslator());
|
||||||
|
$this->validator->initialize($context);
|
||||||
|
$this->validator->validate($form, new Form());
|
||||||
|
|
||||||
|
$this->assertCount(1, $context->getViolations());
|
||||||
|
$this->assertSame('This value should not be blank.', $context->getViolations()[0]->getMessage());
|
||||||
|
$this->assertSame('data', $context->getViolations()[0]->getPropertyPath());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testCompositeConstraintValidatedInEachGroup()
|
||||||
|
{
|
||||||
|
$form = $this->getBuilder('form', null, [
|
||||||
|
'constraints' => [
|
||||||
|
new Collection([
|
||||||
|
'field1' => new NotBlank([
|
||||||
|
'groups' => ['field1'],
|
||||||
|
]),
|
||||||
|
'field2' => new NotBlank([
|
||||||
|
'groups' => ['field2'],
|
||||||
|
]),
|
||||||
|
]),
|
||||||
|
],
|
||||||
|
'validation_groups' => ['field1', 'field2'],
|
||||||
|
])
|
||||||
|
->setData([])
|
||||||
|
->setCompound(true)
|
||||||
|
->setDataMapper(new PropertyPathMapper())
|
||||||
|
->getForm();
|
||||||
|
$form->add($this->getForm('field1'));
|
||||||
|
$form->add($this->getForm('field2'));
|
||||||
|
$form->submit([
|
||||||
|
'field1' => '',
|
||||||
|
'field2' => '',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$context = new ExecutionContext(Validation::createValidator(), $form, new IdentityTranslator());
|
||||||
|
$this->validator->initialize($context);
|
||||||
|
$this->validator->validate($form, new Form());
|
||||||
|
|
||||||
|
$this->assertCount(2, $context->getViolations());
|
||||||
|
$this->assertSame('This value should not be blank.', $context->getViolations()[0]->getMessage());
|
||||||
|
$this->assertSame('data[field1]', $context->getViolations()[0]->getPropertyPath());
|
||||||
|
$this->assertSame('This value should not be blank.', $context->getViolations()[1]->getMessage());
|
||||||
|
$this->assertSame('data[field2]', $context->getViolations()[1]->getPropertyPath());
|
||||||
|
}
|
||||||
|
|
||||||
protected function createValidator()
|
protected function createValidator()
|
||||||
{
|
{
|
||||||
return new FormValidator();
|
return new FormValidator();
|
||||||
|
Reference in New Issue
Block a user