[Form] Refactored validation logic into validate() method. Removed bindGlobals() to reduce API clutter

This commit is contained in:
Bernhard Schussek 2011-02-02 09:41:57 +01:00
parent a204e0df7f
commit 628a4d1fd8
2 changed files with 33 additions and 70 deletions

View File

@ -15,6 +15,7 @@ use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\FileBag;
use Symfony\Component\Validator\ValidatorInterface;
use Symfony\Component\Form\Exception\FormException;
use Symfony\Component\Form\Exception\MissingOptionsException;
use Symfony\Component\Form\Exception\AlreadyBoundException;
use Symfony\Component\Form\Exception\UnexpectedTypeException;
use Symfony\Component\Form\Exception\DanglingFieldException;
@ -725,41 +726,10 @@ class Form extends Field implements \IteratorAggregate, FormInterface
$this->submit(self::deepArrayUnion($values, $files));
if (null === $this->getOption('validator')) {
throw new FormException('A validator is required for binding. Forgot to pass it to the constructor of the form?');
}
// Validate the submitted data
if ($violations = $this->getOption('validator')->validate($this, $this->getOption('validation_groups'))) {
// TODO: test me
foreach ($violations as $violation) {
$propertyPath = new PropertyPath($violation->getPropertyPath());
$iterator = $propertyPath->getIterator();
if ($iterator->current() == 'data') {
$type = self::DATA_ERROR;
$iterator->next(); // point at the first data element
} else {
$type = self::FIELD_ERROR;
}
$this->addError(new FieldError($violation->getMessageTemplate(), $violation->getMessageParameters()), $iterator, $type);
}
}
$this->validate();
}
}
/**
* Binds the form with submitted data from the PHP globals $_POST and
* $_FILES
*
* @see bind()
*/
public function bindGlobals($data = null)
{
$this->bind(Request::createFromGlobals(), $data);
}
/**
* @var Boolean whether a request and an object were bound to the form
*/
@ -768,6 +738,36 @@ class Form extends Field implements \IteratorAggregate, FormInterface
return $this->bound;
}
/**
* Validates the form and its domain object
*
* @throws FormException If the option "validator" was not set
*/
public function validate()
{
if (null === $this->getOption('validator')) {
throw new MissingOptionsException('The option "validator" is required for validating', array('validator'));
}
// Validate the submitted data
if ($violations = $this->getOption('validator')->validate($this, $this->getOption('validation_groups'))) {
// TODO: test me
foreach ($violations as $violation) {
$propertyPath = new PropertyPath($violation->getPropertyPath());
$iterator = $propertyPath->getIterator();
if ($iterator->current() == 'data') {
$type = self::DATA_ERROR;
$iterator->next(); // point at the first data element
} else {
$type = self::FIELD_ERROR;
}
$this->addError(new FieldError($violation->getMessageTemplate(), $violation->getMessageParameters()), $iterator, $type);
}
}
}
/**
* @return true if this form is CSRF protected
*/

View File

@ -220,7 +220,7 @@ class FormTest extends \PHPUnit_Framework_TestCase
$form = new Form('author');
$form->add($field);
$this->setExpectedException('Symfony\Component\Form\Exception\FormException');
$this->setExpectedException('Symfony\Component\Form\Exception\MissingOptionsException');
// data is irrelevant
$form->bind($this->createPostRequest());
@ -270,43 +270,6 @@ class FormTest extends \PHPUnit_Framework_TestCase
$this->assertSame($object, $form->getData());
}
public function testBindGlobals()
{
$_POST = array(
'author' => array(
'name' => 'Bernhard',
'image' => array('filename' => 'foobar.png'),
),
);
$_FILES = array(
'author' => array(
'error' => array('image' => array('file' => UPLOAD_ERR_OK)),
'name' => array('image' => array('file' => 'upload.png')),
'size' => array('image' => array('file' => 123)),
'tmp_name' => array('image' => array('file' => 'abcdef.png')),
'type' => array('image' => array('file' => 'image/png')),
),
);
// don't erase other variables
$_SERVER['REQUEST_METHOD'] = 'POST';
$form = new Form('author', array('validator' => $this->validator));
$form->add(new TestField('name'));
$imageForm = new Form('image');
$imageForm->add(new TestField('file'));
$imageForm->add(new TestField('filename'));
$form->add($imageForm);
$form->bindGlobals();
$file = new UploadedFile('abcdef.png', 'upload.png', 'image/png', 123, UPLOAD_ERR_OK);
$this->assertEquals('Bernhard', $form['name']->getData());
$this->assertEquals('foobar.png', $form['image']['filename']->getData());
$this->assertEquals($file, $form['image']['file']->getData());
}
public function testReadPropertyIsIgnoredIfPropertyPathIsNull()
{
$author = new Author();