Skip to content

Commit

Permalink
validate subforms in all validation groups
Browse files Browse the repository at this point in the history
  • Loading branch information
xabbuh committed May 19, 2020
1 parent 8f2c68f commit d17a4d2
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 6 deletions.
Expand Up @@ -86,7 +86,8 @@ public function validate($form, Constraint $formConstraint)
// sequence recursively, thus some fields could fail
// in different steps without breaking early enough
$this->resolvedGroups[$field] = (array) $group;
$validator->atPath(sprintf($fieldPropertyPath, $field->getPropertyPath()))->validate($field, $formConstraint);
$fieldFormConstraint = new Form();
$validator->atPath(sprintf($fieldPropertyPath, $field->getPropertyPath()))->validate($field, $fieldFormConstraint);
}
}

Expand All @@ -100,6 +101,8 @@ public function validate($form, Constraint $formConstraint)
$this->resolvedGroups = null;
}
} else {
$fieldPropertyPath = \is_object($data) ? 'children[%s]' : 'children%s';

if ($validateDataGraph) {
$validator->atPath('data')->validate($data, null, $groups);
}
Expand All @@ -125,6 +128,13 @@ public function validate($form, Constraint $formConstraint)
}
}
}

foreach ($form->all() as $field) {
if ($field->isSubmitted()) {
$fieldFormConstraint = new Form();
$validator->atPath(sprintf($fieldPropertyPath, $field->getPropertyPath()))->validate($field, $fieldFormConstraint);
}
}
}
} elseif (!$form->isSynchronized()) {
$childrenSynchronized = true;
Expand Down
Expand Up @@ -13,8 +13,8 @@

use Symfony\Component\Form\AbstractExtension;
use Symfony\Component\Form\Extension\Validator\Constraints\Form;
use Symfony\Component\Validator\Constraints\Valid;
use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Mapping\TraversalStrategy;
use Symfony\Component\Validator\Validator\ValidatorInterface;

/**
Expand All @@ -37,7 +37,7 @@ public function __construct(ValidatorInterface $validator)

/* @var $metadata ClassMetadata */
$metadata->addConstraint(new Form());
$metadata->addPropertyConstraint('children', new Valid());
$metadata->traversalStrategy = TraversalStrategy::NONE;

$this->validator = $validator;
}
Expand Down
Expand Up @@ -54,9 +54,8 @@ public function test2Dot5ValidationApi()
$this->assertInstanceOf(FormConstraint::class, $metadata->getConstraints()[0]);

$this->assertSame(CascadingStrategy::NONE, $metadata->cascadingStrategy);
$this->assertSame(TraversalStrategy::IMPLICIT, $metadata->traversalStrategy);
$this->assertSame(CascadingStrategy::CASCADE, $metadata->getPropertyMetadata('children')[0]->cascadingStrategy);
$this->assertSame(TraversalStrategy::IMPLICIT, $metadata->getPropertyMetadata('children')[0]->traversalStrategy);
$this->assertSame(TraversalStrategy::NONE, $metadata->traversalStrategy);
$this->assertCount(0, $metadata->getPropertyMetadata('children'));
}

public function testDataConstraintsInvalidateFormEvenIfFieldIsNotSubmitted()
Expand Down Expand Up @@ -138,6 +137,33 @@ public function testFieldsValidateInSequenceWithNestedGroupsArray()
$this->assertInstanceOf(Length::class, $errors[1]->getCause()->getConstraint());
}

public function testConstraintsInDifferentGroupsOnSingleField()
{
$form = $this->createForm(FormType::class, null, [
'validation_groups' => new GroupSequence(['group1', 'group2']),
])
->add('foo', TextType::class, [
'constraints' => [
new NotBlank([
'groups' => ['group1'],
]),
new Length([
'groups' => ['group2'],
'max' => 3,
]),
],
]);
$form->submit([
'foo' => 'test@example.com',
]);

$errors = $form->getErrors(true);

$this->assertFalse($form->isValid());
$this->assertCount(1, $errors);
$this->assertInstanceOf(Length::class, $errors[0]->getCause()->getConstraint());
}

private function createForm($type, $data = null, array $options = [])
{
$validator = Validation::createValidatorBuilder()
Expand Down

0 comments on commit d17a4d2

Please sign in to comment.