Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit fb91f74

Browse filesBrowse files
committed
[Form] fix group sequence based validation
1 parent 3e874dc commit fb91f74
Copy full SHA for fb91f74

File tree

4 files changed

+56
-24
lines changed
Filter options

4 files changed

+56
-24
lines changed

‎src/Symfony/Component/Form/Extension/Validator/Constraints/FormValidator.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Form/Extension/Validator/Constraints/FormValidator.php
+11-4Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use Symfony\Component\Form\FormInterface;
1515
use Symfony\Component\Validator\Constraint;
16+
use Symfony\Component\Validator\Constraints\GroupSequence;
1617
use Symfony\Component\Validator\ConstraintValidator;
1718
use Symfony\Component\Validator\Context\ExecutionContextInterface;
1819
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
@@ -49,10 +50,12 @@ public function validate($form, Constraint $constraint)
4950

5051
// Validate the data against its own constraints
5152
if (self::allowDataWalking($form)) {
52-
foreach ($groups as $group) {
53-
if ($validator) {
54-
$validator->atPath('data')->validate($form->getData(), null, $group);
55-
} else {
53+
if ($validator) {
54+
if (is_array($groups) && count($groups) > 0 || $groups instanceof GroupSequence && count($groups->groups) > 0) {
55+
$validator->atPath('data')->validate($form->getData(), null, $groups);
56+
}
57+
} else {
58+
foreach ($groups as $group) {
5659
// 2.4 API
5760
$this->context->validate($form->getData(), 'data', $group, true);
5861
}
@@ -218,6 +221,10 @@ private static function resolveValidationGroups($groups, FormInterface $form)
218221
$groups = call_user_func($groups, $form);
219222
}
220223

224+
if ($groups instanceof GroupSequence) {
225+
return $groups;
226+
}
227+
221228
return (array) $groups;
222229
}
223230
}

‎src/Symfony/Component/Form/Extension/Validator/Type/BaseValidatorExtension.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Form/Extension/Validator/Type/BaseValidatorExtension.php
+5Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use Symfony\Component\Form\AbstractTypeExtension;
1515
use Symfony\Component\OptionsResolver\Options;
1616
use Symfony\Component\OptionsResolver\OptionsResolver;
17+
use Symfony\Component\Validator\Constraints\GroupSequence;
1718

1819
/**
1920
* Encapsulates common logic of {@link FormTypeValidatorExtension} and
@@ -42,6 +43,10 @@ public function configureOptions(OptionsResolver $resolver)
4243
return $groups;
4344
}
4445

46+
if ($groups instanceof GroupSequence) {
47+
return $groups;
48+
}
49+
4550
return (array) $groups;
4651
};
4752

‎src/Symfony/Component/Form/Tests/Extension/Validator/Constraints/FormValidatorTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Form/Tests/Extension/Validator/Constraints/FormValidatorTest.php
+30-20Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use Symfony\Component\Form\Extension\Validator\Constraints\Form;
1919
use Symfony\Component\Form\Extension\Validator\Constraints\FormValidator;
2020
use Symfony\Component\Form\SubmitButtonBuilder;
21+
use Symfony\Component\Validator\Constraints\GroupSequence;
2122
use Symfony\Component\Validator\Constraints\NotNull;
2223
use Symfony\Component\Validator\Constraints\NotBlank;
2324
use Symfony\Component\Validator\Tests\Constraints\AbstractConstraintValidatorTest;
@@ -73,8 +74,7 @@ public function testValidate()
7374
->setData($object)
7475
->getForm();
7576

76-
$this->expectValidateAt(0, 'data', $object, 'group1');
77-
$this->expectValidateAt(1, 'data', $object, 'group2');
77+
$this->expectValidateAt(0, 'data', $object, array('group1', 'group2'));
7878

7979
$this->validator->validate($form, new Form());
8080

@@ -96,12 +96,11 @@ public function testValidateConstraints()
9696
->getForm();
9797

9898
// First default constraints
99-
$this->expectValidateAt(0, 'data', $object, 'group1');
100-
$this->expectValidateAt(1, 'data', $object, 'group2');
99+
$this->expectValidateAt(0, 'data', $object, array('group1', 'group2'));
101100

102101
// Then custom constraints
103-
$this->expectValidateValueAt(2, 'data', $object, $constraint1, 'group1');
104-
$this->expectValidateValueAt(3, 'data', $object, $constraint2, 'group2');
102+
$this->expectValidateValueAt(1, 'data', $object, $constraint1, 'group1');
103+
$this->expectValidateValueAt(2, 'data', $object, $constraint2, 'group2');
105104

106105
$this->validator->validate($form, new Form());
107106

@@ -135,7 +134,7 @@ public function testMissingConstraintIndex()
135134
$form = new FormBuilder('name', '\stdClass', $this->dispatcher, $this->factory);
136135
$form = $form->setData($object)->getForm();
137136

138-
$this->expectValidateAt(0, 'data', $object, 'Default');
137+
$this->expectValidateAt(0, 'data', $object, array('Default'));
139138

140139
$this->validator->validate($form, new Form());
141140

@@ -347,15 +346,29 @@ function () { throw new TransformationFailedException(); }
347346
}
348347

349348
public function testHandleCallbackValidationGroups()
349+
{
350+
$object = $this->getMock('\stdClass');
351+
$options = array('validation_groups' => new GroupSequence(array('group1', 'group2')));
352+
$form = $this->getBuilder('name', '\stdClass', $options)
353+
->setData($object)
354+
->getForm();
355+
356+
$this->expectValidateAt(0, 'data', $object, new GroupSequence(array('group1', 'group2')));
357+
358+
$this->validator->validate($form, new Form());
359+
360+
$this->assertNoViolation();
361+
}
362+
363+
public function testHandleGroupSequenceValidationGroups()
350364
{
351365
$object = $this->getMock('\stdClass');
352366
$options = array('validation_groups' => array($this, 'getValidationGroups'));
353367
$form = $this->getBuilder('name', '\stdClass', $options)
354368
->setData($object)
355369
->getForm();
356370

357-
$this->expectValidateAt(0, 'data', $object, 'group1');
358-
$this->expectValidateAt(1, 'data', $object, 'group2');
371+
$this->expectValidateAt(0, 'data', $object, array('group1', 'group2'));
359372

360373
$this->validator->validate($form, new Form());
361374

@@ -370,7 +383,7 @@ public function testDontExecuteFunctionNames()
370383
->setData($object)
371384
->getForm();
372385

373-
$this->expectValidateAt(0, 'data', $object, 'header');
386+
$this->expectValidateAt(0, 'data', $object, array('header'));
374387

375388
$this->validator->validate($form, new Form());
376389

@@ -387,8 +400,7 @@ public function testHandleClosureValidationGroups()
387400
->setData($object)
388401
->getForm();
389402

390-
$this->expectValidateAt(0, 'data', $object, 'group1');
391-
$this->expectValidateAt(1, 'data', $object, 'group2');
403+
$this->expectValidateAt(0, 'data', $object, array('group1', 'group2'));
392404

393405
$this->validator->validate($form, new Form());
394406

@@ -414,7 +426,7 @@ public function testUseValidationGroupOfClickedButton()
414426

415427
$parent->submit(array('name' => $object, 'submit' => ''));
416428

417-
$this->expectValidateAt(0, 'data', $object, 'button_group');
429+
$this->expectValidateAt(0, 'data', $object, array('button_group'));
418430

419431
$this->validator->validate($form, new Form());
420432

@@ -440,7 +452,7 @@ public function testDontUseValidationGroupOfUnclickedButton()
440452

441453
$form->setData($object);
442454

443-
$this->expectValidateAt(0, 'data', $object, 'form_group');
455+
$this->expectValidateAt(0, 'data', $object, array('form_group'));
444456

445457
$this->validator->validate($form, new Form());
446458

@@ -464,7 +476,7 @@ public function testUseInheritedValidationGroup()
464476

465477
$form->setData($object);
466478

467-
$this->expectValidateAt(0, 'data', $object, 'group');
479+
$this->expectValidateAt(0, 'data', $object, array('group'));
468480

469481
$this->validator->validate($form, new Form());
470482

@@ -488,8 +500,7 @@ public function testUseInheritedCallbackValidationGroup()
488500

489501
$form->setData($object);
490502

491-
$this->expectValidateAt(0, 'data', $object, 'group1');
492-
$this->expectValidateAt(1, 'data', $object, 'group2');
503+
$this->expectValidateAt(0, 'data', $object, array('group1', 'group2'));
493504

494505
$this->validator->validate($form, new Form());
495506

@@ -515,8 +526,7 @@ public function testUseInheritedClosureValidationGroup()
515526

516527
$form->setData($object);
517528

518-
$this->expectValidateAt(0, 'data', $object, 'group1');
519-
$this->expectValidateAt(1, 'data', $object, 'group2');
529+
$this->expectValidateAt(0, 'data', $object, array('group1', 'group2'));
520530

521531
$this->validator->validate($form, new Form());
522532

@@ -530,7 +540,7 @@ public function testAppendPropertyPath()
530540
->setData($object)
531541
->getForm();
532542

533-
$this->expectValidateAt(0, 'data', $object, 'Default');
543+
$this->expectValidateAt(0, 'data', $object, array('Default'));
534544

535545
$this->validator->validate($form, new Form());
536546

‎src/Symfony/Component/Form/Tests/Extension/Validator/Type/BaseValidatorExtensionTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Form/Tests/Extension/Validator/Type/BaseValidatorExtensionTest.php
+10Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace Symfony\Component\Form\Tests\Extension\Validator\Type;
1313

1414
use Symfony\Component\Form\Test\FormInterface;
15+
use Symfony\Component\Validator\Constraints\GroupSequence;
1516

1617
/**
1718
* @author Bernhard Schussek <bschussek@gmail.com>
@@ -70,5 +71,14 @@ public function testValidationGroupsCanBeSetToClosure()
7071
$this->assertInternalType('callable', $form->getConfig()->getOption('validation_groups'));
7172
}
7273

74+
public function testValidationGroupsCanBeSetToGroupSequence()
75+
{
76+
$form = $this->createForm(array(
77+
'validation_groups' => new GroupSequence(array('group1', 'group2')),
78+
));
79+
80+
$this->assertInstanceOf('Symfony\Component\Validator\Constraints\GroupSequence', $form->getConfig()->getOption('validation_groups'));
81+
}
82+
7383
abstract protected function createForm(array $options = array());
7484
}

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.