[Validator] Simplified usage of the Callback constraint
This commit is contained in:
parent
98c0d38a44
commit
cccb1db2b2
@ -425,6 +425,64 @@ UPGRADE FROM 2.x to 3.0
|
|||||||
private $property;
|
private $property;
|
||||||
```
|
```
|
||||||
|
|
||||||
|
* The option "methods" of the `Callback` constraint was removed. You should
|
||||||
|
use the option "callback" instead. If you have multiple callbacks, add
|
||||||
|
multiple callback constraints instead.
|
||||||
|
|
||||||
|
Before (YAML):
|
||||||
|
|
||||||
|
```
|
||||||
|
constraints:
|
||||||
|
- Callback: [firstCallback, secondCallback]
|
||||||
|
```
|
||||||
|
|
||||||
|
After (YAML):
|
||||||
|
|
||||||
|
```
|
||||||
|
constraints:
|
||||||
|
- Callback: firstCallback
|
||||||
|
- Callback: secondCallback
|
||||||
|
```
|
||||||
|
|
||||||
|
When using annotations, you can now put the Callback constraint directly on
|
||||||
|
the method that should be executed.
|
||||||
|
|
||||||
|
Before (Annotations):
|
||||||
|
|
||||||
|
```
|
||||||
|
use Symfony\Component\Validator\Constraints as Assert;
|
||||||
|
use Symfony\Component\Validator\ExecutionContextInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Assert\Callback({"callback"})
|
||||||
|
*/
|
||||||
|
class MyClass
|
||||||
|
{
|
||||||
|
public function callback(ExecutionContextInterface $context)
|
||||||
|
{
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
After (Annotations):
|
||||||
|
|
||||||
|
```
|
||||||
|
use Symfony\Component\Validator\Constraints as Assert;
|
||||||
|
use Symfony\Component\Validator\ExecutionContextInterface;
|
||||||
|
|
||||||
|
class MyClass
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @Assert\Callback
|
||||||
|
*/
|
||||||
|
public function callback(ExecutionContextInterface $context)
|
||||||
|
{
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
### Yaml
|
### Yaml
|
||||||
|
|
||||||
* The ability to pass file names to `Yaml::parse()` has been removed.
|
* The ability to pass file names to `Yaml::parse()` has been removed.
|
||||||
|
@ -22,26 +22,52 @@ use Symfony\Component\Validator\Constraint;
|
|||||||
*/
|
*/
|
||||||
class Callback extends Constraint
|
class Callback extends Constraint
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* @var string|callable
|
||||||
|
*
|
||||||
|
* @since 2.4
|
||||||
|
*/
|
||||||
|
public $callback;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array
|
||||||
|
*
|
||||||
|
* @deprecated Deprecated since version 2.4, to be removed in Symfony 3.0.
|
||||||
|
*/
|
||||||
public $methods;
|
public $methods;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritdoc}
|
||||||
*/
|
*/
|
||||||
public function getRequiredOptions()
|
public function __construct($options = null)
|
||||||
{
|
{
|
||||||
return array('methods');
|
// Invocation through annotations with an array parameter only
|
||||||
|
if (is_array($options) && 1 === count($options) && isset($options['value'])) {
|
||||||
|
$options = $options['value'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_array($options) && !isset($options['callback']) && !isset($options['methods']) && !isset($options['groups'])) {
|
||||||
|
if (is_callable($options)) {
|
||||||
|
$options = array('callback' => $options);
|
||||||
|
} else {
|
||||||
|
// BC with Symfony < 2.4
|
||||||
|
$options = array('methods' => $options);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
parent::__construct($options);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritdoc}
|
||||||
*/
|
*/
|
||||||
public function getDefaultOption()
|
public function getDefaultOption()
|
||||||
{
|
{
|
||||||
return 'methods';
|
return 'callback';
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritdoc}
|
||||||
*/
|
*/
|
||||||
public function getTargets()
|
public function getTargets()
|
||||||
{
|
{
|
||||||
|
@ -34,13 +34,20 @@ class CallbackValidator extends ConstraintValidator
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (null !== $constraint->callback && null !== $constraint->methods) {
|
||||||
|
throw new ConstraintDefinitionException(
|
||||||
|
'The Callback constraint supports either the option "callback" ' .
|
||||||
|
'or "methods", but not both at the same time.'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// has to be an array so that we can differentiate between callables
|
// has to be an array so that we can differentiate between callables
|
||||||
// and method names
|
// and method names
|
||||||
if (!is_array($constraint->methods)) {
|
if (null !== $constraint->methods && !is_array($constraint->methods)) {
|
||||||
throw new UnexpectedTypeException($constraint->methods, 'array');
|
throw new UnexpectedTypeException($constraint->methods, 'array');
|
||||||
}
|
}
|
||||||
|
|
||||||
$methods = $constraint->methods;
|
$methods = $constraint->methods ?: array($constraint->callback);
|
||||||
|
|
||||||
foreach ($methods as $method) {
|
foreach ($methods as $method) {
|
||||||
if (is_array($method) || $method instanceof \Closure) {
|
if (is_array($method) || $method instanceof \Closure) {
|
||||||
@ -54,7 +61,13 @@ class CallbackValidator extends ConstraintValidator
|
|||||||
throw new ConstraintDefinitionException(sprintf('Method "%s" targeted by Callback constraint does not exist', $method));
|
throw new ConstraintDefinitionException(sprintf('Method "%s" targeted by Callback constraint does not exist', $method));
|
||||||
}
|
}
|
||||||
|
|
||||||
$object->$method($this->context);
|
$reflMethod = new \ReflectionMethod($object, $method);
|
||||||
|
|
||||||
|
if ($reflMethod->isStatic()) {
|
||||||
|
$reflMethod->invoke(null, $object, $this->context);
|
||||||
|
} else {
|
||||||
|
$reflMethod->invoke($object, $this->context);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
namespace Symfony\Component\Validator\Mapping\Loader;
|
namespace Symfony\Component\Validator\Mapping\Loader;
|
||||||
|
|
||||||
use Doctrine\Common\Annotations\Reader;
|
use Doctrine\Common\Annotations\Reader;
|
||||||
|
use Symfony\Component\Validator\Constraints\Callback;
|
||||||
use Symfony\Component\Validator\Exception\MappingException;
|
use Symfony\Component\Validator\Exception\MappingException;
|
||||||
use Symfony\Component\Validator\Mapping\ClassMetadata;
|
use Symfony\Component\Validator\Mapping\ClassMetadata;
|
||||||
use Symfony\Component\Validator\Constraints\GroupSequence;
|
use Symfony\Component\Validator\Constraints\GroupSequence;
|
||||||
@ -63,7 +64,12 @@ class AnnotationLoader implements LoaderInterface
|
|||||||
foreach ($reflClass->getMethods() as $method) {
|
foreach ($reflClass->getMethods() as $method) {
|
||||||
if ($method->getDeclaringClass()->name == $className) {
|
if ($method->getDeclaringClass()->name == $className) {
|
||||||
foreach ($this->reader->getMethodAnnotations($method) as $constraint) {
|
foreach ($this->reader->getMethodAnnotations($method) as $constraint) {
|
||||||
if ($constraint instanceof Constraint) {
|
if ($constraint instanceof Callback) {
|
||||||
|
$constraint->callback = $method->getName();
|
||||||
|
$constraint->methods = null;
|
||||||
|
|
||||||
|
$metadata->addConstraint($constraint);
|
||||||
|
} elseif ($constraint instanceof Constraint) {
|
||||||
if (preg_match('/^(get|is)(.+)$/i', $method->name, $matches)) {
|
if (preg_match('/^(get|is)(.+)$/i', $method->name, $matches)) {
|
||||||
$metadata->addGetterConstraint(lcfirst($matches[2]), $constraint);
|
$metadata->addGetterConstraint(lcfirst($matches[2]), $constraint);
|
||||||
} else {
|
} else {
|
||||||
|
@ -17,9 +17,9 @@ use Symfony\Component\Validator\Constraints\CallbackValidator;
|
|||||||
|
|
||||||
class CallbackValidatorTest_Class
|
class CallbackValidatorTest_Class
|
||||||
{
|
{
|
||||||
public static function validateStatic($object, ExecutionContext $context)
|
public static function validateCallback($object, ExecutionContext $context)
|
||||||
{
|
{
|
||||||
$context->addViolation('Static message', array('{{ value }}' => 'foobar'), 'invalidValue');
|
$context->addViolation('Callback message', array('{{ value }}' => 'foobar'), 'invalidValue');
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -27,16 +27,16 @@ class CallbackValidatorTest_Class
|
|||||||
|
|
||||||
class CallbackValidatorTest_Object
|
class CallbackValidatorTest_Object
|
||||||
{
|
{
|
||||||
public function validateOne(ExecutionContext $context)
|
public function validate(ExecutionContext $context)
|
||||||
{
|
{
|
||||||
$context->addViolation('My message', array('{{ value }}' => 'foobar'), 'invalidValue');
|
$context->addViolation('My message', array('{{ value }}' => 'foobar'), 'invalidValue');
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function validateTwo(ExecutionContext $context)
|
public static function validateStatic($object, ExecutionContext $context)
|
||||||
{
|
{
|
||||||
$context->addViolation('Other message', array('{{ value }}' => 'baz'), 'otherInvalidValue');
|
$context->addViolation('Static message', array('{{ value }}' => 'baz'), 'otherInvalidValue');
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -68,10 +68,10 @@ class CallbackValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->validator->validate(null, new Callback(array('foo')));
|
$this->validator->validate(null, new Callback(array('foo')));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testCallbackSingleMethod()
|
public function testSingleMethod()
|
||||||
{
|
{
|
||||||
$object = new CallbackValidatorTest_Object();
|
$object = new CallbackValidatorTest_Object();
|
||||||
$constraint = new Callback(array('validateOne'));
|
$constraint = new Callback('validate');
|
||||||
|
|
||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
@ -82,24 +82,137 @@ class CallbackValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->validator->validate($object, $constraint);
|
$this->validator->validate($object, $constraint);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testCallbackSingleStaticMethod()
|
public function testSingleMethodExplicitName()
|
||||||
{
|
{
|
||||||
$object = new CallbackValidatorTest_Object();
|
$object = new CallbackValidatorTest_Object();
|
||||||
|
$constraint = new Callback(array('callback' => 'validate'));
|
||||||
|
|
||||||
|
$this->context->expects($this->once())
|
||||||
|
->method('addViolation')
|
||||||
|
->with('My message', array(
|
||||||
|
'{{ value }}' => 'foobar',
|
||||||
|
));
|
||||||
|
|
||||||
|
$this->validator->validate($object, $constraint);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testSingleStaticMethod()
|
||||||
|
{
|
||||||
|
$object = new CallbackValidatorTest_Object();
|
||||||
|
$constraint = new Callback('validateStatic');
|
||||||
|
|
||||||
$this->context->expects($this->once())
|
$this->context->expects($this->once())
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
->with('Static message', array(
|
->with('Static message', array(
|
||||||
|
'{{ value }}' => 'baz',
|
||||||
|
));
|
||||||
|
|
||||||
|
$this->validator->validate($object, $constraint);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testClosure()
|
||||||
|
{
|
||||||
|
$object = new CallbackValidatorTest_Object();
|
||||||
|
$constraint = new Callback(function ($object, ExecutionContext $context) {
|
||||||
|
$context->addViolation('My message', array('{{ value }}' => 'foobar'), 'invalidValue');
|
||||||
|
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
$this->context->expects($this->once())
|
||||||
|
->method('addViolation')
|
||||||
|
->with('My message', array(
|
||||||
'{{ value }}' => 'foobar',
|
'{{ value }}' => 'foobar',
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate($object, new Callback(array(
|
$this->validator->validate($object, $constraint);
|
||||||
array(__CLASS__.'_Class', 'validateStatic')
|
|
||||||
)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testCallbackMultipleMethods()
|
public function testClosureExplicitName()
|
||||||
{
|
{
|
||||||
$object = new CallbackValidatorTest_Object();
|
$object = new CallbackValidatorTest_Object();
|
||||||
|
$constraint = new Callback(array(
|
||||||
|
'callback' => function ($object, ExecutionContext $context) {
|
||||||
|
$context->addViolation('My message', array('{{ value }}' => 'foobar'), 'invalidValue');
|
||||||
|
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
));
|
||||||
|
|
||||||
|
$this->context->expects($this->once())
|
||||||
|
->method('addViolation')
|
||||||
|
->with('My message', array(
|
||||||
|
'{{ value }}' => 'foobar',
|
||||||
|
));
|
||||||
|
|
||||||
|
$this->validator->validate($object, $constraint);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testArrayCallable()
|
||||||
|
{
|
||||||
|
$object = new CallbackValidatorTest_Object();
|
||||||
|
$constraint = new Callback(array(__CLASS__.'_Class', 'validateCallback'));
|
||||||
|
|
||||||
|
$this->context->expects($this->once())
|
||||||
|
->method('addViolation')
|
||||||
|
->with('Callback message', array(
|
||||||
|
'{{ value }}' => 'foobar',
|
||||||
|
));
|
||||||
|
|
||||||
|
$this->validator->validate($object, $constraint);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testArrayCallableExplicitName()
|
||||||
|
{
|
||||||
|
$object = new CallbackValidatorTest_Object();
|
||||||
|
$constraint = new Callback(array(
|
||||||
|
'callback' => array(__CLASS__.'_Class', 'validateCallback'),
|
||||||
|
));
|
||||||
|
|
||||||
|
$this->context->expects($this->once())
|
||||||
|
->method('addViolation')
|
||||||
|
->with('Callback message', array(
|
||||||
|
'{{ value }}' => 'foobar',
|
||||||
|
));
|
||||||
|
|
||||||
|
$this->validator->validate($object, $constraint);
|
||||||
|
}
|
||||||
|
|
||||||
|
// BC with Symfony < 2.4
|
||||||
|
public function testSingleMethodBc()
|
||||||
|
{
|
||||||
|
$object = new CallbackValidatorTest_Object();
|
||||||
|
$constraint = new Callback(array('validate'));
|
||||||
|
|
||||||
|
$this->context->expects($this->once())
|
||||||
|
->method('addViolation')
|
||||||
|
->with('My message', array(
|
||||||
|
'{{ value }}' => 'foobar',
|
||||||
|
));
|
||||||
|
|
||||||
|
$this->validator->validate($object, $constraint);
|
||||||
|
}
|
||||||
|
|
||||||
|
// BC with Symfony < 2.4
|
||||||
|
public function testSingleMethodBcExplicitName()
|
||||||
|
{
|
||||||
|
$object = new CallbackValidatorTest_Object();
|
||||||
|
$constraint = new Callback(array('methods' => array('validate')));
|
||||||
|
|
||||||
|
$this->context->expects($this->once())
|
||||||
|
->method('addViolation')
|
||||||
|
->with('My message', array(
|
||||||
|
'{{ value }}' => 'foobar',
|
||||||
|
));
|
||||||
|
|
||||||
|
$this->validator->validate($object, $constraint);
|
||||||
|
}
|
||||||
|
|
||||||
|
// BC with Symfony < 2.4
|
||||||
|
public function testMultipleMethodsBc()
|
||||||
|
{
|
||||||
|
$object = new CallbackValidatorTest_Object();
|
||||||
|
$constraint = new Callback(array('validate', 'validateStatic'));
|
||||||
|
|
||||||
$this->context->expects($this->at(0))
|
$this->context->expects($this->at(0))
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
@ -108,23 +221,67 @@ class CallbackValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
));
|
));
|
||||||
$this->context->expects($this->at(1))
|
$this->context->expects($this->at(1))
|
||||||
->method('addViolation')
|
->method('addViolation')
|
||||||
->with('Other message', array(
|
->with('Static message', array(
|
||||||
'{{ value }}' => 'baz',
|
'{{ value }}' => 'baz',
|
||||||
));
|
));
|
||||||
|
|
||||||
$this->validator->validate($object, new Callback(array(
|
$this->validator->validate($object, $constraint);
|
||||||
'validateOne', 'validateTwo'
|
|
||||||
)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
// BC with Symfony < 2.4
|
||||||
* @expectedException \Symfony\Component\Validator\Exception\UnexpectedTypeException
|
public function testMultipleMethodsBcExplicitName()
|
||||||
*/
|
|
||||||
public function testExpectCallbackArray()
|
|
||||||
{
|
{
|
||||||
$object = new CallbackValidatorTest_Object();
|
$object = new CallbackValidatorTest_Object();
|
||||||
|
$constraint = new Callback(array(
|
||||||
|
'methods' => array('validate', 'validateStatic'),
|
||||||
|
));
|
||||||
|
|
||||||
$this->validator->validate($object, new Callback('foobar'));
|
$this->context->expects($this->at(0))
|
||||||
|
->method('addViolation')
|
||||||
|
->with('My message', array(
|
||||||
|
'{{ value }}' => 'foobar',
|
||||||
|
));
|
||||||
|
$this->context->expects($this->at(1))
|
||||||
|
->method('addViolation')
|
||||||
|
->with('Static message', array(
|
||||||
|
'{{ value }}' => 'baz',
|
||||||
|
));
|
||||||
|
|
||||||
|
$this->validator->validate($object, $constraint);
|
||||||
|
}
|
||||||
|
|
||||||
|
// BC with Symfony < 2.4
|
||||||
|
public function testSingleStaticMethodBc()
|
||||||
|
{
|
||||||
|
$object = new CallbackValidatorTest_Object();
|
||||||
|
$constraint = new Callback(array(
|
||||||
|
array(__CLASS__.'_Class', 'validateCallback')
|
||||||
|
));
|
||||||
|
|
||||||
|
$this->context->expects($this->once())
|
||||||
|
->method('addViolation')
|
||||||
|
->with('Callback message', array(
|
||||||
|
'{{ value }}' => 'foobar',
|
||||||
|
));
|
||||||
|
|
||||||
|
$this->validator->validate($object, $constraint);
|
||||||
|
}
|
||||||
|
|
||||||
|
// BC with Symfony < 2.4
|
||||||
|
public function testSingleStaticMethodBcExplicitName()
|
||||||
|
{
|
||||||
|
$object = new CallbackValidatorTest_Object();
|
||||||
|
$constraint = new Callback(array(
|
||||||
|
'methods' => array(array(__CLASS__.'_Class', 'validateCallback')),
|
||||||
|
));
|
||||||
|
|
||||||
|
$this->context->expects($this->once())
|
||||||
|
->method('addViolation')
|
||||||
|
->with('Callback message', array(
|
||||||
|
'{{ value }}' => 'foobar',
|
||||||
|
));
|
||||||
|
|
||||||
|
$this->validator->validate($object, $constraint);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -147,10 +304,43 @@ class CallbackValidatorTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->validator->validate($object, new Callback(array(array('foo', 'bar'))));
|
$this->validator->validate($object, new Callback(array(array('foo', 'bar'))));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @expectedException \Symfony\Component\Validator\Exception\ConstraintDefinitionException
|
||||||
|
*/
|
||||||
|
public function testExpectEitherCallbackOrMethods()
|
||||||
|
{
|
||||||
|
$object = new CallbackValidatorTest_Object();
|
||||||
|
|
||||||
|
$this->validator->validate($object, new Callback(array(
|
||||||
|
'callback' => 'validate',
|
||||||
|
'methods' => array('validateStatic'),
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
|
||||||
public function testConstraintGetTargets()
|
public function testConstraintGetTargets()
|
||||||
{
|
{
|
||||||
$constraint = new Callback(array('foo'));
|
$constraint = new Callback(array('foo'));
|
||||||
|
|
||||||
$this->assertEquals('class', $constraint->getTargets());
|
$this->assertEquals('class', $constraint->getTargets());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Should succeed. Needed when defining constraints as annotations.
|
||||||
|
public function testNoConstructorArguments()
|
||||||
|
{
|
||||||
|
new Callback();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testAnnotationInvocationSingleValued()
|
||||||
|
{
|
||||||
|
$constraint = new Callback(array('value' => 'validateStatic'));
|
||||||
|
|
||||||
|
$this->assertEquals(new Callback('validateStatic'), $constraint);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testAnnotationInvocationMultiValued()
|
||||||
|
{
|
||||||
|
$constraint = new Callback(array('value' => array(__CLASS__.'_Class', 'validateCallback')));
|
||||||
|
|
||||||
|
$this->assertEquals(new Callback(array(__CLASS__.'_Class', 'validateCallback')), $constraint);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,24 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Symfony\Component\Validator\Tests\Fixtures;
|
||||||
|
|
||||||
|
use Symfony\Component\Validator\ExecutionContextInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Bernhard Schussek <bschussek@gmail.com>
|
||||||
|
*/
|
||||||
|
class CallbackClass
|
||||||
|
{
|
||||||
|
public static function callback($object, ExecutionContextInterface $context)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
@ -12,10 +12,12 @@
|
|||||||
namespace Symfony\Component\Validator\Tests\Fixtures;
|
namespace Symfony\Component\Validator\Tests\Fixtures;
|
||||||
|
|
||||||
use Symfony\Component\Validator\Constraints as Assert;
|
use Symfony\Component\Validator\Constraints as Assert;
|
||||||
|
use Symfony\Component\Validator\ExecutionContextInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Symfony\Component\Validator\Tests\Fixtures\ConstraintA
|
* @Symfony\Component\Validator\Tests\Fixtures\ConstraintA
|
||||||
* @Assert\GroupSequence({"Foo", "Entity"})
|
* @Assert\GroupSequence({"Foo", "Entity"})
|
||||||
|
* @Assert\Callback({"Symfony\Component\Validator\Tests\Fixtures\CallbackClass", "callback"})
|
||||||
*/
|
*/
|
||||||
class Entity extends EntityParent implements EntityInterface
|
class Entity extends EntityParent implements EntityInterface
|
||||||
{
|
{
|
||||||
@ -58,4 +60,18 @@ class Entity extends EntityParent implements EntityInterface
|
|||||||
{
|
{
|
||||||
return 'Overridden data';
|
return 'Overridden data';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Assert\Callback
|
||||||
|
*/
|
||||||
|
public function validateMe(ExecutionContextInterface $context)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Assert\Callback
|
||||||
|
*/
|
||||||
|
public static function validateMeStatic($object, ExecutionContextInterface $context)
|
||||||
|
{
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,7 @@ namespace Symfony\Component\Validator\Tests\Mapping\Loader;
|
|||||||
|
|
||||||
use Doctrine\Common\Annotations\AnnotationReader;
|
use Doctrine\Common\Annotations\AnnotationReader;
|
||||||
use Symfony\Component\Validator\Constraints\All;
|
use Symfony\Component\Validator\Constraints\All;
|
||||||
|
use Symfony\Component\Validator\Constraints\Callback;
|
||||||
use Symfony\Component\Validator\Constraints\Collection;
|
use Symfony\Component\Validator\Constraints\Collection;
|
||||||
use Symfony\Component\Validator\Constraints\NotNull;
|
use Symfony\Component\Validator\Constraints\NotNull;
|
||||||
use Symfony\Component\Validator\Constraints\Range;
|
use Symfony\Component\Validator\Constraints\Range;
|
||||||
@ -50,6 +51,9 @@ class AnnotationLoaderTest extends \PHPUnit_Framework_TestCase
|
|||||||
$expected = new ClassMetadata('Symfony\Component\Validator\Tests\Fixtures\Entity');
|
$expected = new ClassMetadata('Symfony\Component\Validator\Tests\Fixtures\Entity');
|
||||||
$expected->setGroupSequence(array('Foo', 'Entity'));
|
$expected->setGroupSequence(array('Foo', 'Entity'));
|
||||||
$expected->addConstraint(new ConstraintA());
|
$expected->addConstraint(new ConstraintA());
|
||||||
|
$expected->addConstraint(new Callback(array('Symfony\Component\Validator\Tests\Fixtures\CallbackClass', 'callback')));
|
||||||
|
$expected->addConstraint(new Callback('validateMe'));
|
||||||
|
$expected->addConstraint(new Callback('validateMeStatic'));
|
||||||
$expected->addPropertyConstraint('firstName', new NotNull());
|
$expected->addPropertyConstraint('firstName', new NotNull());
|
||||||
$expected->addPropertyConstraint('firstName', new Range(array('min' => 3)));
|
$expected->addPropertyConstraint('firstName', new Range(array('min' => 3)));
|
||||||
$expected->addPropertyConstraint('firstName', new All(array(new NotNull(), new Range(array('min' => 3)))));
|
$expected->addPropertyConstraint('firstName', new All(array(new NotNull(), new Range(array('min' => 3)))));
|
||||||
@ -114,6 +118,9 @@ class AnnotationLoaderTest extends \PHPUnit_Framework_TestCase
|
|||||||
|
|
||||||
$expected->setGroupSequence(array('Foo', 'Entity'));
|
$expected->setGroupSequence(array('Foo', 'Entity'));
|
||||||
$expected->addConstraint(new ConstraintA());
|
$expected->addConstraint(new ConstraintA());
|
||||||
|
$expected->addConstraint(new Callback(array('Symfony\Component\Validator\Tests\Fixtures\CallbackClass', 'callback')));
|
||||||
|
$expected->addConstraint(new Callback('validateMe'));
|
||||||
|
$expected->addConstraint(new Callback('validateMeStatic'));
|
||||||
$expected->addPropertyConstraint('firstName', new NotNull());
|
$expected->addPropertyConstraint('firstName', new NotNull());
|
||||||
$expected->addPropertyConstraint('firstName', new Range(array('min' => 3)));
|
$expected->addPropertyConstraint('firstName', new Range(array('min' => 3)));
|
||||||
$expected->addPropertyConstraint('firstName', new All(array(new NotNull(), new Range(array('min' => 3)))));
|
$expected->addPropertyConstraint('firstName', new All(array(new NotNull(), new Range(array('min' => 3)))));
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
namespace Symfony\Component\Validator\Tests\Mapping\Loader;
|
namespace Symfony\Component\Validator\Tests\Mapping\Loader;
|
||||||
|
|
||||||
use Symfony\Component\Validator\Constraints\All;
|
use Symfony\Component\Validator\Constraints\All;
|
||||||
|
use Symfony\Component\Validator\Constraints\Callback;
|
||||||
use Symfony\Component\Validator\Constraints\Collection;
|
use Symfony\Component\Validator\Constraints\Collection;
|
||||||
use Symfony\Component\Validator\Constraints\NotNull;
|
use Symfony\Component\Validator\Constraints\NotNull;
|
||||||
use Symfony\Component\Validator\Constraints\Range;
|
use Symfony\Component\Validator\Constraints\Range;
|
||||||
@ -51,6 +52,9 @@ class XmlFileLoaderTest extends \PHPUnit_Framework_TestCase
|
|||||||
$expected->setGroupSequence(array('Foo', 'Entity'));
|
$expected->setGroupSequence(array('Foo', 'Entity'));
|
||||||
$expected->addConstraint(new ConstraintA());
|
$expected->addConstraint(new ConstraintA());
|
||||||
$expected->addConstraint(new ConstraintB());
|
$expected->addConstraint(new ConstraintB());
|
||||||
|
$expected->addConstraint(new Callback('validateMe'));
|
||||||
|
$expected->addConstraint(new Callback('validateMeStatic'));
|
||||||
|
$expected->addConstraint(new Callback(array('Symfony\Component\Validator\Tests\Fixtures\CallbackClass', 'callback')));
|
||||||
$expected->addPropertyConstraint('firstName', new NotNull());
|
$expected->addPropertyConstraint('firstName', new NotNull());
|
||||||
$expected->addPropertyConstraint('firstName', new Range(array('min' => 3)));
|
$expected->addPropertyConstraint('firstName', new Range(array('min' => 3)));
|
||||||
$expected->addPropertyConstraint('firstName', new Choice(array('A', 'B')));
|
$expected->addPropertyConstraint('firstName', new Choice(array('A', 'B')));
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
namespace Symfony\Component\Validator\Tests\Mapping\Loader;
|
namespace Symfony\Component\Validator\Tests\Mapping\Loader;
|
||||||
|
|
||||||
use Symfony\Component\Validator\Constraints\All;
|
use Symfony\Component\Validator\Constraints\All;
|
||||||
|
use Symfony\Component\Validator\Constraints\Callback;
|
||||||
use Symfony\Component\Validator\Constraints\Collection;
|
use Symfony\Component\Validator\Constraints\Collection;
|
||||||
use Symfony\Component\Validator\Constraints\NotNull;
|
use Symfony\Component\Validator\Constraints\NotNull;
|
||||||
use Symfony\Component\Validator\Constraints\Range;
|
use Symfony\Component\Validator\Constraints\Range;
|
||||||
@ -68,6 +69,9 @@ class YamlFileLoaderTest extends \PHPUnit_Framework_TestCase
|
|||||||
$expected->setGroupSequence(array('Foo', 'Entity'));
|
$expected->setGroupSequence(array('Foo', 'Entity'));
|
||||||
$expected->addConstraint(new ConstraintA());
|
$expected->addConstraint(new ConstraintA());
|
||||||
$expected->addConstraint(new ConstraintB());
|
$expected->addConstraint(new ConstraintB());
|
||||||
|
$expected->addConstraint(new Callback('validateMe'));
|
||||||
|
$expected->addConstraint(new Callback('validateMeStatic'));
|
||||||
|
$expected->addConstraint(new Callback(array('Symfony\Component\Validator\Tests\Fixtures\CallbackClass', 'callback')));
|
||||||
$expected->addPropertyConstraint('firstName', new NotNull());
|
$expected->addPropertyConstraint('firstName', new NotNull());
|
||||||
$expected->addPropertyConstraint('firstName', new Range(array('min' => 3)));
|
$expected->addPropertyConstraint('firstName', new Range(array('min' => 3)));
|
||||||
$expected->addPropertyConstraint('firstName', new Choice(array('A', 'B')));
|
$expected->addPropertyConstraint('firstName', new Choice(array('A', 'B')));
|
||||||
|
@ -21,6 +21,16 @@
|
|||||||
<!-- Custom constraint with namespace abbreviation-->
|
<!-- Custom constraint with namespace abbreviation-->
|
||||||
<constraint name="custom:ConstraintB" />
|
<constraint name="custom:ConstraintB" />
|
||||||
|
|
||||||
|
<!-- Callbacks -->
|
||||||
|
<constraint name="Callback">validateMe</constraint>
|
||||||
|
|
||||||
|
<constraint name="Callback">validateMeStatic</constraint>
|
||||||
|
|
||||||
|
<constraint name="Callback">
|
||||||
|
<value>Symfony\Component\Validator\Tests\Fixtures\CallbackClass</value>
|
||||||
|
<value>callback</value>
|
||||||
|
</constraint>
|
||||||
|
|
||||||
<!-- PROPERTY CONSTRAINTS -->
|
<!-- PROPERTY CONSTRAINTS -->
|
||||||
|
|
||||||
<property name="firstName">
|
<property name="firstName">
|
||||||
|
@ -11,6 +11,10 @@ Symfony\Component\Validator\Tests\Fixtures\Entity:
|
|||||||
- Symfony\Component\Validator\Tests\Fixtures\ConstraintA: ~
|
- Symfony\Component\Validator\Tests\Fixtures\ConstraintA: ~
|
||||||
# Custom constraint with namespaces prefix
|
# Custom constraint with namespaces prefix
|
||||||
- "custom:ConstraintB": ~
|
- "custom:ConstraintB": ~
|
||||||
|
# Callbacks
|
||||||
|
- Callback: validateMe
|
||||||
|
- Callback: validateMeStatic
|
||||||
|
- Callback: [Symfony\Component\Validator\Tests\Fixtures\CallbackClass, callback]
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
firstName:
|
firstName:
|
||||||
|
Reference in New Issue
Block a user