Forráskód Böngészése

Merge remote branch 'bschussek/rename-execute'

* bschussek/rename-execute:
  [Form] Fixed validation.xml
  [Validator] Added support for static callbacks to Callback constraint
  [Validator] Renamed Execute constraint to Callback
Fabien Potencier 14 éve
szülő
commit
e5a5c63050

+ 2 - 2
src/Symfony/Component/Form/Resources/config/validation.xml

@@ -7,13 +7,13 @@
   <class name="Symfony\Component\Form\Field">
     <getter property="transformationSuccessful">
       <constraint name="AssertTrue">
-        <option name="message">This value is invalid</option>
+        <option name="message"><value>This value is invalid</value></option>
       </constraint>
     </getter>
   </class>
 
   <class name="Symfony\Component\Form\Form">
-    <constraint name="Execute">validateData</constraint>
+    <constraint name="Callback">validateData</constraint>
     <property name="fields">
       <constraint name="Valid" />
     </property>

+ 1 - 1
src/Symfony/Component/Validator/Constraints/Execute.php

@@ -11,7 +11,7 @@
 
 namespace Symfony\Component\Validator\Constraints;
 
-class Execute extends \Symfony\Component\Validator\Constraint
+class Callback extends \Symfony\Component\Validator\Constraint
 {
     public $methods;
 

+ 21 - 7
src/Symfony/Component/Validator/Constraints/ExecuteValidator.php

@@ -17,11 +17,11 @@ use Symfony\Component\Validator\Exception\UnexpectedTypeException;
 use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
 
 /**
- * Validator for Execute constraint
+ * Validator for Callback constraint
  *
  * @author Bernhard Schussek <bernhard.schussek@symfony.com>
  */
-class ExecuteValidator extends ConstraintValidator
+class CallbackValidator extends ConstraintValidator
 {
     public function isValid($object, Constraint $constraint)
     {
@@ -29,7 +29,13 @@ class ExecuteValidator extends ConstraintValidator
             return true;
         }
 
-        $methods = (array)$constraint->methods;
+        // has to be an array so that we can differentiate between callables
+        // and method names
+        if (!is_array($constraint->methods)) {
+            throw new UnexpectedTypeException($constraint->methods, 'array');
+        }
+
+        $methods = $constraint->methods;
         $context = $this->context;
 
         // save context state
@@ -39,11 +45,19 @@ class ExecuteValidator extends ConstraintValidator
         $propertyPath = $context->getPropertyPath();
 
         foreach ($methods as $method) {
-            if (!method_exists($object, $method)) {
-                throw new ConstraintDefinitionException(sprintf('Method "%s" targeted by Execute constraint does not exist', $method));
-            }
+            if (is_array($method)) {
+                if (!is_callable($method)) {
+                    throw new ConstraintDefinitionException(sprintf('"%s::%s" targeted by Callback constraint is not a valid callable', $method[0], $method[1]));
+                }
 
-            $object->$method($context);
+                call_user_func($method, $object, $context);
+            } else {
+                if (!method_exists($object, $method)) {
+                    throw new ConstraintDefinitionException(sprintf('Method "%s" targeted by Callback constraint does not exist', $method));
+                }
+
+                $object->$method($context);
+            }
 
             // restore context state
             $context->setCurrentClass($currentClass);

+ 79 - 12
tests/Symfony/Tests/Component/Validator/Constraints/ExecuteValidatorTest.php

@@ -14,10 +14,23 @@ namespace Symfony\Tests\Component\Validator;
 use Symfony\Component\Validator\ExecutionContext;
 use Symfony\Component\Validator\ConstraintViolation;
 use Symfony\Component\Validator\ConstraintViolationList;
-use Symfony\Component\Validator\Constraints\Execute;
-use Symfony\Component\Validator\Constraints\ExecuteValidator;
+use Symfony\Component\Validator\Constraints\Callback;
+use Symfony\Component\Validator\Constraints\CallbackValidator;
 
-class ExecuteValidatorTest_Object
+class CallbackValidatorTest_Class
+{
+    public static function validateStatic($object, ExecutionContext $context)
+    {
+        $context->setCurrentClass('Foo');
+        $context->setCurrentProperty('bar');
+        $context->setGroup('mygroup');
+        $context->setPropertyPath('foo.bar');
+
+        $context->addViolation('Static message', array('parameter'), 'invalidValue');
+    }
+}
+
+class CallbackValidatorTest_Object
 {
     public function validateOne(ExecutionContext $context)
     {
@@ -35,7 +48,7 @@ class ExecuteValidatorTest_Object
     }
 }
 
-class ExecuteValidatorTest extends \PHPUnit_Framework_TestCase
+class CallbackValidatorTest extends \PHPUnit_Framework_TestCase
 {
     protected $validator;
     protected $walker;
@@ -52,20 +65,20 @@ class ExecuteValidatorTest extends \PHPUnit_Framework_TestCase
         $this->context->setGroup('InitialGroup');
         $this->context->setPropertyPath('initial.property.path');
 
-        $this->validator = new ExecuteValidator();
+        $this->validator = new CallbackValidator();
         $this->validator->initialize($this->context);
     }
 
     public function testNullIsValid()
     {
-        $this->assertTrue($this->validator->isValid(null, new Execute('foo')));
+        $this->assertTrue($this->validator->isValid(null, new Callback(array('foo'))));
     }
 
-    public function testExecuteSingleMethod()
+    public function testCallbackSingleMethod()
     {
-        $object = new ExecuteValidatorTest_Object();
+        $object = new CallbackValidatorTest_Object();
 
-        $this->assertTrue($this->validator->isValid($object, new Execute('validateOne')));
+        $this->assertTrue($this->validator->isValid($object, new Callback(array('validateOne'))));
 
         $violations = new ConstraintViolationList();
         $violations->add(new ConstraintViolation(
@@ -83,11 +96,35 @@ class ExecuteValidatorTest extends \PHPUnit_Framework_TestCase
         $this->assertEquals('initial.property.path', $this->context->getPropertyPath());
     }
 
-    public function testExecuteMultipleMethods()
+    public function testCallbackSingleStaticMethod()
     {
-        $object = new ExecuteValidatorTest_Object();
+        $object = new CallbackValidatorTest_Object();
 
-        $this->assertTrue($this->validator->isValid($object, new Execute(array(
+        $this->assertTrue($this->validator->isValid($object, new Callback(array(
+            array(__NAMESPACE__.'\CallbackValidatorTest_Class', 'validateStatic')
+        ))));
+
+        $violations = new ConstraintViolationList();
+        $violations->add(new ConstraintViolation(
+            'Static message',
+            array('parameter'),
+            'Root',
+            'foo.bar',
+            'invalidValue'
+        ));
+
+        $this->assertEquals($violations, $this->context->getViolations());
+        $this->assertEquals('InitialClass', $this->context->getCurrentClass());
+        $this->assertEquals('initialProperty', $this->context->getCurrentProperty());
+        $this->assertEquals('InitialGroup', $this->context->getGroup());
+        $this->assertEquals('initial.property.path', $this->context->getPropertyPath());
+    }
+
+    public function testCallbackMultipleMethods()
+    {
+        $object = new CallbackValidatorTest_Object();
+
+        $this->assertTrue($this->validator->isValid($object, new Callback(array(
             'validateOne', 'validateTwo'
         ))));
 
@@ -111,4 +148,34 @@ class ExecuteValidatorTest extends \PHPUnit_Framework_TestCase
 
         $this->assertEquals($violations, $this->context->getViolations());
     }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\UnexpectedTypeException
+     */
+    public function testExpectCallbackArray()
+    {
+        $object = new CallbackValidatorTest_Object();
+
+        $this->validator->isValid($object, new Callback('foobar'));
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\ConstraintDefinitionException
+     */
+    public function testExpectValidMethods()
+    {
+        $object = new CallbackValidatorTest_Object();
+
+        $this->validator->isValid($object, new Callback(array('foobar')));
+    }
+
+    /**
+     * @expectedException Symfony\Component\Validator\Exception\ConstraintDefinitionException
+     */
+    public function testExpectValidCallbacks()
+    {
+        $object = new CallbackValidatorTest_Object();
+
+        $this->validator->isValid($object, new Callback(array(array('foo', 'bar'))));
+    }
 }