diff --git a/src/Symfony/Component/Form/Form.php b/src/Symfony/Component/Form/Form.php index 1828312240..f6399af5e3 100644 --- a/src/Symfony/Component/Form/Form.php +++ b/src/Symfony/Component/Form/Form.php @@ -736,16 +736,19 @@ class Form extends Field implements \IteratorAggregate, FormInterface throw new MissingOptionsException('The option "validator" is required for validating', array('validator')); } - // Validate the submitted data in the domain object in the sets - // validation group(s) - if ($violations = $validator->validate($this->getData(), $groups)) { - foreach ($violations as $violation) { - $propertyPath = new PropertyPath($violation->getPropertyPath()); - $iterator = $propertyPath->getIterator(); - $iterator->next(); // point at the first data element - $error = new DataError($violation->getMessageTemplate(), $violation->getMessageParameters()); + // Only validate data if it is a domain object + if (is_object($this->getData())) { + // Validate the submitted data in the domain object in the sets + // validation group(s) + if ($violations = $validator->validate($this->getData(), $groups)) { + foreach ($violations as $violation) { + $propertyPath = new PropertyPath($violation->getPropertyPath()); + $iterator = $propertyPath->getIterator(); + $iterator->next(); // point at the first data element + $error = new DataError($violation->getMessageTemplate(), $violation->getMessageParameters()); - $this->addError($error, $iterator); + $this->addError($error, $iterator); + } } } diff --git a/tests/Symfony/Tests/Component/Form/FormTest.php b/tests/Symfony/Tests/Component/Form/FormTest.php index 642463e8cd..a2a35181a3 100644 --- a/tests/Symfony/Tests/Component/Form/FormTest.php +++ b/tests/Symfony/Tests/Component/Form/FormTest.php @@ -200,13 +200,13 @@ class FormTest extends \PHPUnit_Framework_TestCase public function testBindUsesValidationGroups() { - $field = $this->createMockField('firstName'); $form = new Form('author', array( 'validation_groups' => 'group', 'validator' => $this->validator, )); - $form->add($field); + $form->add(new TestField('firstName')); + // both the form and the object are validated $this->validator->expects($this->exactly(2)) ->method('validate'); @@ -221,8 +221,26 @@ class FormTest extends \PHPUnit_Framework_TestCase // ->method('validate') // ->with($this->equalTo($form)); - // data is irrelevant - $form->bind($this->createPostRequest()); + // concrete request is irrelevant + // data is an object + $form->bind($this->createPostRequest(), new Author()); + } + + public function testBindDoesNotValidateArrays() + { + $form = new Form('author', array( + 'validator' => $this->validator, + )); + $form->add(new TestField('firstName')); + + // only the form is validated + $this->validator->expects($this->once()) + ->method('validate') + ->with($this->equalTo($form)); + + // concrete request is irrelevant + // data is an array + $form->bind($this->createPostRequest(), array()); } public function testBindThrowsExceptionIfNoValidatorIsSet()