[Form] Fixed arrays not to be passed to the validator

This commit is contained in:
Bernhard Schussek 2011-02-02 17:32:24 +01:00
parent 1c3e3f7744
commit 7c9c7af863
2 changed files with 34 additions and 13 deletions

View File

@ -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);
}
}
}

View File

@ -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()