bug #23722 [Form] Fixed GroupSequence with "constraints" option (HeahDude)

This PR was merged into the 2.7 branch.

Discussion
----------

[Form] Fixed GroupSequence with "constraints" option

| Q             | A
| ------------- | ---
| Branch?       | 2.7
| Bug fix?      | yes
| New feature?  | no
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | #22373
| License       | MIT
| Doc PR        | ~

Commits
-------

e39e7a4fa9 [Form] Fixed GroupSequence with "constraints" option
This commit is contained in:
Maxime Steinhausser 2017-09-18 19:51:43 +02:00
commit c3518b59ef
3 changed files with 62 additions and 14 deletions

View File

@ -65,18 +65,38 @@ class FormValidator extends ConstraintValidator
// Validate the data against the constraints defined
// in the form
$constraints = $config->getOption('constraints', array());
foreach ($constraints as $constraint) {
foreach ($groups as $group) {
if (in_array($group, $constraint->groups)) {
if ($validator) {
$validator->atPath('data')->validate($form->getData(), $constraint, $group);
} else {
// 2.4 API
$this->context->validateValue($form->getData(), $constraint, 'data', $group);
if ($groups instanceof GroupSequence) {
if ($validator) {
$validator->atPath('data')->validate($form->getData(), $constraints, $groups);
} else {
// 2.4 API
foreach ($groups as $group) {
foreach ($constraints as $constraint) {
if (in_array($group, $constraint->groups)) {
$this->context->validateValue($form->getData(), $constraint, 'data', $group);
}
}
// Prevent duplicate validation
continue 2;
if (count($this->context->getViolations()) > 0) {
break;
}
}
}
} else {
foreach ($constraints as $constraint) {
foreach ($groups as $group) {
if (in_array($group, $constraint->groups)) {
if ($validator) {
$validator->atPath('data')->validate($form->getData(), $constraint, $group);
} else {
// 2.4 API
$this->context->validateValue($form->getData(), $constraint, 'data', $group);
}
// Prevent duplicate validation
continue 2;
}
}
}
}

View File

@ -342,7 +342,7 @@ class FormValidatorTest extends AbstractConstraintValidatorTest
$this->assertNoViolation();
}
public function testHandleCallbackValidationGroups()
public function testHandleGroupSequenceValidationGroups()
{
$object = $this->getMockBuilder('\stdClass')->getMock();
$options = array('validation_groups' => new GroupSequence(array('group1', 'group2')));
@ -351,13 +351,14 @@ class FormValidatorTest extends AbstractConstraintValidatorTest
->getForm();
$this->expectValidateAt(0, 'data', $object, new GroupSequence(array('group1', 'group2')));
$this->expectValidateAt(1, 'data', $object, new GroupSequence(array('group1', 'group2')));
$this->validator->validate($form, new Form());
$this->assertNoViolation();
}
public function testHandleGroupSequenceValidationGroups()
public function testHandleCallbackValidationGroups()
{
$object = $this->getMockBuilder('\stdClass')->getMock();
$options = array('validation_groups' => array($this, 'getValidationGroups'));

View File

@ -12,14 +12,22 @@
namespace Symfony\Component\Form\Tests\Extension\Validator\Type;
use Symfony\Component\Form\Extension\Validator\Type\FormTypeValidatorExtension;
use Symfony\Component\Form\Extension\Validator\ValidatorExtension;
use Symfony\Component\Form\Forms;
use Symfony\Component\Form\Tests\Extension\Core\Type\FormTypeTest;
use Symfony\Component\Form\Tests\Extension\Core\Type\TextTypeTest;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Constraints\GroupSequence;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\ConstraintViolationList;
use Symfony\Component\Validator\Validation;
class FormTypeValidatorExtensionTest extends BaseValidatorExtensionTest
{
public function testSubmitValidatesData()
{
$builder = $this->factory->createBuilder(
'form',
FormTypeTest::TESTED_TYPE,
null,
array(
'validation_groups' => 'group',
@ -63,8 +71,27 @@ class FormTypeValidatorExtensionTest extends BaseValidatorExtensionTest
new FormTypeValidatorExtension(null);
}
public function testGroupSequenceWithConstraintsOption()
{
$form = Forms::createFormFactoryBuilder()
->addExtension(new ValidatorExtension(Validation::createValidator()))
->getFormFactory()
->create(FormTypeTest::TESTED_TYPE, null, (array('validation_groups' => new GroupSequence(array('First', 'Second')))))
->add('field', TextTypeTest::TESTED_TYPE, array(
'constraints' => array(
new Length(array('min' => 10, 'groups' => array('First'))),
new Email(array('groups' => array('Second'))),
),
))
;
$form->submit(array('field' => 'wrong'));
$this->assertCount(1, $form->getErrors(true));
}
protected function createForm(array $options = array())
{
return $this->factory->create('form', null, $options);
return $this->factory->create(FormTypeTest::TESTED_TYPE, null, $options);
}
}