Pārlūkot izejas kodu

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

Bernhard Schussek 14 gadi atpakaļ
vecāks
revīzija
7c9c7af863

+ 13 - 10
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());
-
-                $this->addError($error, $iterator);
+        // 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);
+                }
             }
         }
 

+ 22 - 4
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()