bug #20975 [Form] fix group sequence based validation (xabbuh)
This PR was merged into the 2.7 branch.
Discussion
----------
[Form] fix group sequence based validation
| Q | A
| ------------- | ---
| Branch? | 2.7
| Bug fix? | yes
| New feature? | no
| BC breaks? | no
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets | #20929
| License | MIT
| Doc PR |
Commits
-------
fb91f74
[Form] fix group sequence based validation
This commit is contained in:
commit
2f24e690f6
@ -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\GroupSequence;
|
||||||
use Symfony\Component\Validator\ConstraintValidator;
|
use Symfony\Component\Validator\ConstraintValidator;
|
||||||
use Symfony\Component\Validator\Context\ExecutionContextInterface;
|
use Symfony\Component\Validator\Context\ExecutionContextInterface;
|
||||||
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
|
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
|
||||||
@ -49,10 +50,12 @@ class FormValidator extends ConstraintValidator
|
|||||||
|
|
||||||
// Validate the data against its own constraints
|
// Validate the data against its own constraints
|
||||||
if (self::allowDataWalking($form)) {
|
if (self::allowDataWalking($form)) {
|
||||||
foreach ($groups as $group) {
|
|
||||||
if ($validator) {
|
if ($validator) {
|
||||||
$validator->atPath('data')->validate($form->getData(), null, $group);
|
if (is_array($groups) && count($groups) > 0 || $groups instanceof GroupSequence && count($groups->groups) > 0) {
|
||||||
|
$validator->atPath('data')->validate($form->getData(), null, $groups);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
|
foreach ($groups as $group) {
|
||||||
// 2.4 API
|
// 2.4 API
|
||||||
$this->context->validate($form->getData(), 'data', $group, true);
|
$this->context->validate($form->getData(), 'data', $group, true);
|
||||||
}
|
}
|
||||||
@ -218,6 +221,10 @@ class FormValidator extends ConstraintValidator
|
|||||||
$groups = call_user_func($groups, $form);
|
$groups = call_user_func($groups, $form);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($groups instanceof GroupSequence) {
|
||||||
|
return $groups;
|
||||||
|
}
|
||||||
|
|
||||||
return (array) $groups;
|
return (array) $groups;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,7 @@ namespace Symfony\Component\Form\Extension\Validator\Type;
|
|||||||
use Symfony\Component\Form\AbstractTypeExtension;
|
use Symfony\Component\Form\AbstractTypeExtension;
|
||||||
use Symfony\Component\OptionsResolver\Options;
|
use Symfony\Component\OptionsResolver\Options;
|
||||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||||
|
use Symfony\Component\Validator\Constraints\GroupSequence;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encapsulates common logic of {@link FormTypeValidatorExtension} and
|
* Encapsulates common logic of {@link FormTypeValidatorExtension} and
|
||||||
@ -42,6 +43,10 @@ abstract class BaseValidatorExtension extends AbstractTypeExtension
|
|||||||
return $groups;
|
return $groups;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($groups instanceof GroupSequence) {
|
||||||
|
return $groups;
|
||||||
|
}
|
||||||
|
|
||||||
return (array) $groups;
|
return (array) $groups;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@ use Symfony\Component\Form\FormInterface;
|
|||||||
use Symfony\Component\Form\Extension\Validator\Constraints\Form;
|
use Symfony\Component\Form\Extension\Validator\Constraints\Form;
|
||||||
use Symfony\Component\Form\Extension\Validator\Constraints\FormValidator;
|
use Symfony\Component\Form\Extension\Validator\Constraints\FormValidator;
|
||||||
use Symfony\Component\Form\SubmitButtonBuilder;
|
use Symfony\Component\Form\SubmitButtonBuilder;
|
||||||
|
use Symfony\Component\Validator\Constraints\GroupSequence;
|
||||||
use Symfony\Component\Validator\Constraints\NotNull;
|
use Symfony\Component\Validator\Constraints\NotNull;
|
||||||
use Symfony\Component\Validator\Constraints\NotBlank;
|
use Symfony\Component\Validator\Constraints\NotBlank;
|
||||||
use Symfony\Component\Validator\Tests\Constraints\AbstractConstraintValidatorTest;
|
use Symfony\Component\Validator\Tests\Constraints\AbstractConstraintValidatorTest;
|
||||||
@ -70,8 +71,7 @@ class FormValidatorTest extends AbstractConstraintValidatorTest
|
|||||||
->setData($object)
|
->setData($object)
|
||||||
->getForm();
|
->getForm();
|
||||||
|
|
||||||
$this->expectValidateAt(0, 'data', $object, 'group1');
|
$this->expectValidateAt(0, 'data', $object, array('group1', 'group2'));
|
||||||
$this->expectValidateAt(1, 'data', $object, 'group2');
|
|
||||||
|
|
||||||
$this->validator->validate($form, new Form());
|
$this->validator->validate($form, new Form());
|
||||||
|
|
||||||
@ -93,12 +93,11 @@ class FormValidatorTest extends AbstractConstraintValidatorTest
|
|||||||
->getForm();
|
->getForm();
|
||||||
|
|
||||||
// First default constraints
|
// First default constraints
|
||||||
$this->expectValidateAt(0, 'data', $object, 'group1');
|
$this->expectValidateAt(0, 'data', $object, array('group1', 'group2'));
|
||||||
$this->expectValidateAt(1, 'data', $object, 'group2');
|
|
||||||
|
|
||||||
// Then custom constraints
|
// Then custom constraints
|
||||||
$this->expectValidateValueAt(2, 'data', $object, $constraint1, 'group1');
|
$this->expectValidateValueAt(1, 'data', $object, $constraint1, 'group1');
|
||||||
$this->expectValidateValueAt(3, 'data', $object, $constraint2, 'group2');
|
$this->expectValidateValueAt(2, 'data', $object, $constraint2, 'group2');
|
||||||
|
|
||||||
$this->validator->validate($form, new Form());
|
$this->validator->validate($form, new Form());
|
||||||
|
|
||||||
@ -132,7 +131,7 @@ class FormValidatorTest extends AbstractConstraintValidatorTest
|
|||||||
$form = new FormBuilder('name', '\stdClass', $this->dispatcher, $this->factory);
|
$form = new FormBuilder('name', '\stdClass', $this->dispatcher, $this->factory);
|
||||||
$form = $form->setData($object)->getForm();
|
$form = $form->setData($object)->getForm();
|
||||||
|
|
||||||
$this->expectValidateAt(0, 'data', $object, 'Default');
|
$this->expectValidateAt(0, 'data', $object, array('Default'));
|
||||||
|
|
||||||
$this->validator->validate($form, new Form());
|
$this->validator->validate($form, new Form());
|
||||||
|
|
||||||
@ -344,6 +343,21 @@ class FormValidatorTest extends AbstractConstraintValidatorTest
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function testHandleCallbackValidationGroups()
|
public function testHandleCallbackValidationGroups()
|
||||||
|
{
|
||||||
|
$object = $this->getMockBuilder('\stdClass')->getMock();
|
||||||
|
$options = array('validation_groups' => new GroupSequence(array('group1', 'group2')));
|
||||||
|
$form = $this->getBuilder('name', '\stdClass', $options)
|
||||||
|
->setData($object)
|
||||||
|
->getForm();
|
||||||
|
|
||||||
|
$this->expectValidateAt(0, 'data', $object, new GroupSequence(array('group1', 'group2')));
|
||||||
|
|
||||||
|
$this->validator->validate($form, new Form());
|
||||||
|
|
||||||
|
$this->assertNoViolation();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testHandleGroupSequenceValidationGroups()
|
||||||
{
|
{
|
||||||
$object = $this->getMockBuilder('\stdClass')->getMock();
|
$object = $this->getMockBuilder('\stdClass')->getMock();
|
||||||
$options = array('validation_groups' => array($this, 'getValidationGroups'));
|
$options = array('validation_groups' => array($this, 'getValidationGroups'));
|
||||||
@ -351,8 +365,7 @@ class FormValidatorTest extends AbstractConstraintValidatorTest
|
|||||||
->setData($object)
|
->setData($object)
|
||||||
->getForm();
|
->getForm();
|
||||||
|
|
||||||
$this->expectValidateAt(0, 'data', $object, 'group1');
|
$this->expectValidateAt(0, 'data', $object, array('group1', 'group2'));
|
||||||
$this->expectValidateAt(1, 'data', $object, 'group2');
|
|
||||||
|
|
||||||
$this->validator->validate($form, new Form());
|
$this->validator->validate($form, new Form());
|
||||||
|
|
||||||
@ -367,7 +380,7 @@ class FormValidatorTest extends AbstractConstraintValidatorTest
|
|||||||
->setData($object)
|
->setData($object)
|
||||||
->getForm();
|
->getForm();
|
||||||
|
|
||||||
$this->expectValidateAt(0, 'data', $object, 'header');
|
$this->expectValidateAt(0, 'data', $object, array('header'));
|
||||||
|
|
||||||
$this->validator->validate($form, new Form());
|
$this->validator->validate($form, new Form());
|
||||||
|
|
||||||
@ -384,8 +397,7 @@ class FormValidatorTest extends AbstractConstraintValidatorTest
|
|||||||
->setData($object)
|
->setData($object)
|
||||||
->getForm();
|
->getForm();
|
||||||
|
|
||||||
$this->expectValidateAt(0, 'data', $object, 'group1');
|
$this->expectValidateAt(0, 'data', $object, array('group1', 'group2'));
|
||||||
$this->expectValidateAt(1, 'data', $object, 'group2');
|
|
||||||
|
|
||||||
$this->validator->validate($form, new Form());
|
$this->validator->validate($form, new Form());
|
||||||
|
|
||||||
@ -411,7 +423,7 @@ class FormValidatorTest extends AbstractConstraintValidatorTest
|
|||||||
|
|
||||||
$parent->submit(array('name' => $object, 'submit' => ''));
|
$parent->submit(array('name' => $object, 'submit' => ''));
|
||||||
|
|
||||||
$this->expectValidateAt(0, 'data', $object, 'button_group');
|
$this->expectValidateAt(0, 'data', $object, array('button_group'));
|
||||||
|
|
||||||
$this->validator->validate($form, new Form());
|
$this->validator->validate($form, new Form());
|
||||||
|
|
||||||
@ -437,7 +449,7 @@ class FormValidatorTest extends AbstractConstraintValidatorTest
|
|||||||
|
|
||||||
$form->setData($object);
|
$form->setData($object);
|
||||||
|
|
||||||
$this->expectValidateAt(0, 'data', $object, 'form_group');
|
$this->expectValidateAt(0, 'data', $object, array('form_group'));
|
||||||
|
|
||||||
$this->validator->validate($form, new Form());
|
$this->validator->validate($form, new Form());
|
||||||
|
|
||||||
@ -461,7 +473,7 @@ class FormValidatorTest extends AbstractConstraintValidatorTest
|
|||||||
|
|
||||||
$form->setData($object);
|
$form->setData($object);
|
||||||
|
|
||||||
$this->expectValidateAt(0, 'data', $object, 'group');
|
$this->expectValidateAt(0, 'data', $object, array('group'));
|
||||||
|
|
||||||
$this->validator->validate($form, new Form());
|
$this->validator->validate($form, new Form());
|
||||||
|
|
||||||
@ -485,8 +497,7 @@ class FormValidatorTest extends AbstractConstraintValidatorTest
|
|||||||
|
|
||||||
$form->setData($object);
|
$form->setData($object);
|
||||||
|
|
||||||
$this->expectValidateAt(0, 'data', $object, 'group1');
|
$this->expectValidateAt(0, 'data', $object, array('group1', 'group2'));
|
||||||
$this->expectValidateAt(1, 'data', $object, 'group2');
|
|
||||||
|
|
||||||
$this->validator->validate($form, new Form());
|
$this->validator->validate($form, new Form());
|
||||||
|
|
||||||
@ -512,8 +523,7 @@ class FormValidatorTest extends AbstractConstraintValidatorTest
|
|||||||
|
|
||||||
$form->setData($object);
|
$form->setData($object);
|
||||||
|
|
||||||
$this->expectValidateAt(0, 'data', $object, 'group1');
|
$this->expectValidateAt(0, 'data', $object, array('group1', 'group2'));
|
||||||
$this->expectValidateAt(1, 'data', $object, 'group2');
|
|
||||||
|
|
||||||
$this->validator->validate($form, new Form());
|
$this->validator->validate($form, new Form());
|
||||||
|
|
||||||
@ -527,7 +537,7 @@ class FormValidatorTest extends AbstractConstraintValidatorTest
|
|||||||
->setData($object)
|
->setData($object)
|
||||||
->getForm();
|
->getForm();
|
||||||
|
|
||||||
$this->expectValidateAt(0, 'data', $object, 'Default');
|
$this->expectValidateAt(0, 'data', $object, array('Default'));
|
||||||
|
|
||||||
$this->validator->validate($form, new Form());
|
$this->validator->validate($form, new Form());
|
||||||
|
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
namespace Symfony\Component\Form\Tests\Extension\Validator\Type;
|
namespace Symfony\Component\Form\Tests\Extension\Validator\Type;
|
||||||
|
|
||||||
use Symfony\Component\Form\Test\FormInterface;
|
use Symfony\Component\Form\Test\FormInterface;
|
||||||
|
use Symfony\Component\Validator\Constraints\GroupSequence;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Bernhard Schussek <bschussek@gmail.com>
|
* @author Bernhard Schussek <bschussek@gmail.com>
|
||||||
@ -70,5 +71,14 @@ abstract class BaseValidatorExtensionTest extends TypeTestCase
|
|||||||
$this->assertInternalType('callable', $form->getConfig()->getOption('validation_groups'));
|
$this->assertInternalType('callable', $form->getConfig()->getOption('validation_groups'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testValidationGroupsCanBeSetToGroupSequence()
|
||||||
|
{
|
||||||
|
$form = $this->createForm(array(
|
||||||
|
'validation_groups' => new GroupSequence(array('group1', 'group2')),
|
||||||
|
));
|
||||||
|
|
||||||
|
$this->assertInstanceOf('Symfony\Component\Validator\Constraints\GroupSequence', $form->getConfig()->getOption('validation_groups'));
|
||||||
|
}
|
||||||
|
|
||||||
abstract protected function createForm(array $options = array());
|
abstract protected function createForm(array $options = array());
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user