diff --git a/src/Symfony/Component/Form/Extension/Core/Type/FormType.php b/src/Symfony/Component/Form/Extension/Core/Type/FormType.php index a64b5ac465eb7..4cf51d64ffbc7 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/FormType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/FormType.php @@ -187,6 +187,7 @@ public function setDefaultOptions(OptionsResolverInterface $resolver) // According to RFC 2396 (http://www.ietf.org/rfc/rfc2396.txt) // section 4.2., empty URIs are considered same-document references 'action' => '', + 'allow_extra_fields' => false, )); $resolver->setAllowedTypes(array( diff --git a/src/Symfony/Component/Form/Extension/Validator/Constraints/FormValidator.php b/src/Symfony/Component/Form/Extension/Validator/Constraints/FormValidator.php index 8f02364e81f08..0cd00829e8077 100644 --- a/src/Symfony/Component/Form/Extension/Validator/Constraints/FormValidator.php +++ b/src/Symfony/Component/Form/Extension/Validator/Constraints/FormValidator.php @@ -122,7 +122,7 @@ public function validate($form, Constraint $constraint) } // Mark the form with an error if it contains extra fields - if (count($form->getExtraData()) > 0) { + if (count($form->getExtraData()) > 0 && !$config->getOption('allow_extra_fields', false)) { $this->context->addViolation( $config->getOption('extra_fields_message'), array('{{ extra_fields }}' => implode('", "', array_keys($form->getExtraData()))), 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 a8bdde8a4d3a9..f3f401ea467a6 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Validator/Constraints/FormValidatorTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Validator/Constraints/FormValidatorTest.php @@ -615,6 +615,25 @@ public function testViolationIfExtraData() $this->validator->validate($form, new Form()); } + public function testNoViolationIfExtraDataAllowed() + { + $context = $this->getMockExecutionContext(); + + $form = $this->getBuilder('parent', null, array('allow_extra_fields'=>true)) + ->setCompound(true) + ->setDataMapper($this->getDataMapper()) + ->add($this->getBuilder('child')) + ->getForm(); + + $form->submit(array('foo' => 'bar')); + + $context->expects($this->never()) + ->method('addViolation'); + + $this->validator->initialize($context); + $this->validator->validate($form, new Form()); + } + /** * @dataProvider getPostMaxSizeFixtures */