/** * {@inheritdoc} * * @throws UnexpectedTypeException When the constraint isn't a subclass of {@see AbstractAssertionConstraint} * @throws ConstraintDefinitionException When the assertion doesn't exist on the assertion class */ public function validate($value, Constraint $constraint) { if (!$constraint instanceof AbstractAssertionConstraint) { throw new UnexpectedTypeException($constraint, __NAMESPACE__ . '\\AbstractAssertionConstraint'); } $methodName = $constraint->getAssertionMethodName(); $callable = [static::$assertClass, $methodName]; $override = null; if (is_callable($callable) === false) { throw new ConstraintDefinitionException('Must be a valid callable on the assertion class'); } $parameters = array($value); foreach ($constraint->getAssertionParameterNames() as $name) { $parameters[] = $constraint->{$name}; } try { call_user_func_array($callable, $parameters); } catch (\Exception $e) { if ($e instanceof static::$assertExceptionClass) { $this->context->buildViolation($e->getMessage())->setParameter('{{ value }}', $this->formatValue($value))->setCode($e->getCode())->setCause($e)->addViolation(); } else { throw $e; } } }