Chris@0: Chris@0: * Chris@0: * For the full copyright and license information, please view the LICENSE Chris@0: * file that was distributed with this source code. Chris@0: */ Chris@0: Chris@0: namespace Symfony\Component\Validator\Constraints; Chris@0: Chris@0: use Symfony\Component\Validator\Constraint; Chris@0: use Symfony\Component\Validator\ConstraintValidator; Chris@0: use Symfony\Component\Validator\Exception\ConstraintDefinitionException; Chris@0: use Symfony\Component\Validator\Exception\UnexpectedTypeException; Chris@0: Chris@0: /** Chris@0: * Validator for Callback constraint. Chris@0: * Chris@0: * @author Bernhard Schussek Chris@0: */ Chris@0: class CallbackValidator extends ConstraintValidator Chris@0: { Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function validate($object, Constraint $constraint) Chris@0: { Chris@0: if (!$constraint instanceof Callback) { Chris@0: throw new UnexpectedTypeException($constraint, __NAMESPACE__.'\Callback'); Chris@0: } Chris@0: Chris@0: $method = $constraint->callback; Chris@0: if ($method instanceof \Closure) { Chris@0: $method($object, $this->context, $constraint->payload); Chris@0: } elseif (is_array($method)) { Chris@0: if (!is_callable($method)) { Chris@0: if (isset($method[0]) && is_object($method[0])) { Chris@0: $method[0] = get_class($method[0]); Chris@0: } Chris@0: throw new ConstraintDefinitionException(sprintf('%s targeted by Callback constraint is not a valid callable', json_encode($method))); Chris@0: } Chris@0: Chris@0: call_user_func($method, $object, $this->context, $constraint->payload); Chris@0: } elseif (null !== $object) { Chris@0: if (!method_exists($object, $method)) { Chris@0: throw new ConstraintDefinitionException(sprintf('Method "%s" targeted by Callback constraint does not exist in class %s', $method, get_class($object))); Chris@0: } Chris@0: Chris@0: $reflMethod = new \ReflectionMethod($object, $method); Chris@0: Chris@0: if ($reflMethod->isStatic()) { Chris@0: $reflMethod->invoke(null, $object, $this->context, $constraint->payload); Chris@0: } else { Chris@0: $reflMethod->invoke($object, $this->context, $constraint->payload); Chris@0: } Chris@0: } Chris@0: } Chris@0: }