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
This commit is contained in:
Fabien Potencier 2011-03-25 06:57:17 +01:00
commit e5a5c63050
4 changed files with 103 additions and 22 deletions

View File

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

View File

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

View File

@ -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 (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]));
}
call_user_func($method, $object, $context);
} else {
if (!method_exists($object, $method)) {
throw new ConstraintDefinitionException(sprintf('Method "%s" targeted by Execute constraint does not exist', $method));
throw new ConstraintDefinitionException(sprintf('Method "%s" targeted by Callback constraint does not exist', $method));
}
$object->$method($context);
}
// restore context state
$context->setCurrentClass($currentClass);

View File

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