feature #16909 Allows access to payload in callback validator (conradkleinespel)

This PR was merged into the 3.1-dev branch.

Discussion
----------

Allows access to payload in callback validator

| Q             | A
| ------------- | ---
| Bug fix?      | no
| New feature?  | yes
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | #15092
| License       | MIT
| Doc PR        | none

Commits
-------

26cd91d allows access to payload in callback validator
This commit is contained in:
Fabien Potencier 2016-01-25 09:16:45 +01:00
commit 36c2961def
2 changed files with 28 additions and 4 deletions

View File

@ -34,7 +34,7 @@ class CallbackValidator extends ConstraintValidator
$method = $constraint->callback;
if ($method instanceof \Closure) {
$method($object, $this->context);
$method($object, $this->context, $constraint->payload);
} elseif (is_array($method)) {
if (!is_callable($method)) {
if (isset($method[0]) && is_object($method[0])) {
@ -43,7 +43,7 @@ class CallbackValidator extends ConstraintValidator
throw new ConstraintDefinitionException(sprintf('%s targeted by Callback constraint is not a valid callable', json_encode($method)));
}
call_user_func($method, $object, $this->context);
call_user_func($method, $object, $this->context, $constraint->payload);
} elseif (null !== $object) {
if (!method_exists($object, $method)) {
throw new ConstraintDefinitionException(sprintf('Method "%s" targeted by Callback constraint does not exist in class %s', $method, get_class($object)));
@ -52,9 +52,9 @@ class CallbackValidator extends ConstraintValidator
$reflMethod = new \ReflectionMethod($object, $method);
if ($reflMethod->isStatic()) {
$reflMethod->invoke(null, $object, $this->context);
$reflMethod->invoke(null, $object, $this->context, $constraint->payload);
} else {
$reflMethod->invoke($object, $this->context);
$reflMethod->invoke($object, $this->context, $constraint->payload);
}
}
}

View File

@ -226,4 +226,28 @@ class CallbackValidatorTest extends AbstractConstraintValidatorTest
$this->assertEquals(new Callback(array(__CLASS__.'_Class', 'validateCallback')), $constraint);
}
public function testPayloadIsPassedToCallback()
{
$object = new \stdClass();
$payloadCopy = null;
$constraint = new Callback([
'callback' => function($object, ExecutionContextInterface $constraint, $payload) use (&$payloadCopy) {
$payloadCopy = $payload;
},
'payload' => 'Hello world!',
]);
$this->validator->validate($object, $constraint);
$this->assertEquals('Hello world!', $payloadCopy);
$payloadCopy = null;
$constraint = new Callback([
'callback' => function($object, ExecutionContextInterface $constraint, $payload) use (&$payloadCopy) {
$payloadCopy = $payload;
},
]);
$this->validator->validate($object, $constraint);
$this->assertNull($payloadCopy);
}
}