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:
commit
e5a5c63050
@ -7,13 +7,13 @@
|
|||||||
<class name="Symfony\Component\Form\Field">
|
<class name="Symfony\Component\Form\Field">
|
||||||
<getter property="transformationSuccessful">
|
<getter property="transformationSuccessful">
|
||||||
<constraint name="AssertTrue">
|
<constraint name="AssertTrue">
|
||||||
<option name="message">This value is invalid</option>
|
<option name="message"><value>This value is invalid</value></option>
|
||||||
</constraint>
|
</constraint>
|
||||||
</getter>
|
</getter>
|
||||||
</class>
|
</class>
|
||||||
|
|
||||||
<class name="Symfony\Component\Form\Form">
|
<class name="Symfony\Component\Form\Form">
|
||||||
<constraint name="Execute">validateData</constraint>
|
<constraint name="Callback">validateData</constraint>
|
||||||
<property name="fields">
|
<property name="fields">
|
||||||
<constraint name="Valid" />
|
<constraint name="Valid" />
|
||||||
</property>
|
</property>
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
|
|
||||||
namespace Symfony\Component\Validator\Constraints;
|
namespace Symfony\Component\Validator\Constraints;
|
||||||
|
|
||||||
class Execute extends \Symfony\Component\Validator\Constraint
|
class Callback extends \Symfony\Component\Validator\Constraint
|
||||||
{
|
{
|
||||||
public $methods;
|
public $methods;
|
||||||
|
|
@ -17,11 +17,11 @@ use Symfony\Component\Validator\Exception\UnexpectedTypeException;
|
|||||||
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
|
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Validator for Execute constraint
|
* Validator for Callback constraint
|
||||||
*
|
*
|
||||||
* @author Bernhard Schussek <bernhard.schussek@symfony.com>
|
* @author Bernhard Schussek <bernhard.schussek@symfony.com>
|
||||||
*/
|
*/
|
||||||
class ExecuteValidator extends ConstraintValidator
|
class CallbackValidator extends ConstraintValidator
|
||||||
{
|
{
|
||||||
public function isValid($object, Constraint $constraint)
|
public function isValid($object, Constraint $constraint)
|
||||||
{
|
{
|
||||||
@ -29,7 +29,13 @@ class ExecuteValidator extends ConstraintValidator
|
|||||||
return true;
|
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;
|
$context = $this->context;
|
||||||
|
|
||||||
// save context state
|
// save context state
|
||||||
@ -39,11 +45,19 @@ class ExecuteValidator extends ConstraintValidator
|
|||||||
$propertyPath = $context->getPropertyPath();
|
$propertyPath = $context->getPropertyPath();
|
||||||
|
|
||||||
foreach ($methods as $method) {
|
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)) {
|
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);
|
$object->$method($context);
|
||||||
|
}
|
||||||
|
|
||||||
// restore context state
|
// restore context state
|
||||||
$context->setCurrentClass($currentClass);
|
$context->setCurrentClass($currentClass);
|
@ -14,10 +14,23 @@ namespace Symfony\Tests\Component\Validator;
|
|||||||
use Symfony\Component\Validator\ExecutionContext;
|
use Symfony\Component\Validator\ExecutionContext;
|
||||||
use Symfony\Component\Validator\ConstraintViolation;
|
use Symfony\Component\Validator\ConstraintViolation;
|
||||||
use Symfony\Component\Validator\ConstraintViolationList;
|
use Symfony\Component\Validator\ConstraintViolationList;
|
||||||
use Symfony\Component\Validator\Constraints\Execute;
|
use Symfony\Component\Validator\Constraints\Callback;
|
||||||
use Symfony\Component\Validator\Constraints\ExecuteValidator;
|
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)
|
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 $validator;
|
||||||
protected $walker;
|
protected $walker;
|
||||||
@ -52,20 +65,20 @@ class ExecuteValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->context->setGroup('InitialGroup');
|
$this->context->setGroup('InitialGroup');
|
||||||
$this->context->setPropertyPath('initial.property.path');
|
$this->context->setPropertyPath('initial.property.path');
|
||||||
|
|
||||||
$this->validator = new ExecuteValidator();
|
$this->validator = new CallbackValidator();
|
||||||
$this->validator->initialize($this->context);
|
$this->validator->initialize($this->context);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testNullIsValid()
|
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 = new ConstraintViolationList();
|
||||||
$violations->add(new ConstraintViolation(
|
$violations->add(new ConstraintViolation(
|
||||||
@ -83,11 +96,35 @@ class ExecuteValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->assertEquals('initial.property.path', $this->context->getPropertyPath());
|
$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'
|
'validateOne', 'validateTwo'
|
||||||
))));
|
))));
|
||||||
|
|
||||||
@ -111,4 +148,34 @@ class ExecuteValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
|
|
||||||
$this->assertEquals($violations, $this->context->getViolations());
|
$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'))));
|
||||||
|
}
|
||||||
}
|
}
|
Reference in New Issue
Block a user