diff --git a/src/Symfony/Component/Form/Extension/Validator/Constraints/FormValidator.php b/src/Symfony/Component/Form/Extension/Validator/Constraints/FormValidator.php index 167fcd95e9755..e6b0d3e06024d 100644 --- a/src/Symfony/Component/Form/Extension/Validator/Constraints/FormValidator.php +++ b/src/Symfony/Component/Form/Extension/Validator/Constraints/FormValidator.php @@ -105,8 +105,8 @@ public function validate($form, Constraint $constraint) } } - // Mark the form with an error if it contains extra fields - if (count($form->getExtraData()) > 0) { + // Mark the form with an error if it contains not allowed extra fields + if ($config->getOption('forbid_extra_data') && count($form->getExtraData()) > 0) { $this->context->addViolation( $config->getOption('extra_fields_message'), array('{{ extra_fields }}' => implode('", "', array_keys($form->getExtraData()))), diff --git a/src/Symfony/Component/Form/Extension/Validator/Type/FormTypeValidatorExtension.php b/src/Symfony/Component/Form/Extension/Validator/Type/FormTypeValidatorExtension.php index fe55ed79710dc..ef9bfabd46805 100644 --- a/src/Symfony/Component/Form/Extension/Validator/Type/FormTypeValidatorExtension.php +++ b/src/Symfony/Component/Form/Extension/Validator/Type/FormTypeValidatorExtension.php @@ -85,6 +85,7 @@ public function setDefaultOptions(OptionsResolverInterface $resolver) 'cascade_validation' => false, 'invalid_message' => 'This value is not valid.', 'invalid_message_parameters' => array(), + 'forbid_extra_data' => true, 'extra_fields_message' => 'This form should not contain extra fields.', 'post_max_size_message' => 'The uploaded file was too large. Please try to upload a smaller file.', )); diff --git a/src/Symfony/Component/Form/Tests/Extension/Validator/Constraints/FormValidatorTest.php b/src/Symfony/Component/Form/Tests/Extension/Validator/Constraints/FormValidatorTest.php index a3d9f26d98617..d0e49ee197a43 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Validator/Constraints/FormValidatorTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Validator/Constraints/FormValidatorTest.php @@ -433,8 +433,12 @@ public function testDontWalkScalars() public function testViolationIfExtraData() { $context = $this->getMockExecutionContext(); + $options = array( + 'extra_fields_message' => 'Extra!', + 'forbid_extra_data' => true, + ); - $form = $this->getBuilder('parent', null, array('extra_fields_message' => 'Extra!')) + $form = $this->getBuilder('parent', null, $options) ->setCompound(true) ->setDataMapper($this->getDataMapper()) ->add($this->getBuilder('child')) @@ -456,6 +460,27 @@ public function testViolationIfExtraData() $this->validator->validate($form, new Form()); } + public function testDontMarkInvalidIfNotForbidExtraData() + { + $context = $this->getMockExecutionContext(); + + $form = $this->getBuilder('parent', null, array('forbid_extra_data' => false)) + ->setCompound(true) + ->setDataMapper($this->getDataMapper()) + ->add($this->getBuilder('child')) + ->getForm(); + + $form->bind(array('foo' => 'bar')); + + $context->expects($this->never()) + ->method('addViolation'); + $context->expects($this->never()) + ->method('addViolationAt'); + + $this->validator->initialize($context); + $this->validator->validate($form, new Form()); + } + /** * @dataProvider getPostMaxSizeFixtures */