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@17: } elseif (\is_array($method)) { Chris@17: if (!\is_callable($method)) { Chris@17: if (isset($method[0]) && \is_object($method[0])) { Chris@17: $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@17: \call_user_func($method, $object, $this->context, $constraint->payload); Chris@0: } elseif (null !== $object) { Chris@0: if (!method_exists($object, $method)) { Chris@17: 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: }