* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Bundle\FrameworkBundle\Validator; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\Validator\Constraint; use Symfony\Component\Validator\ConstraintValidatorFactoryInterface; use Symfony\Component\Validator\ConstraintValidatorInterface; use Symfony\Component\Validator\Exception\UnexpectedTypeException; use Symfony\Component\Validator\Exception\ValidatorException; /** * Uses a service container to create constraint validators. * * A constraint validator should be tagged as "validator.constraint_validator" * in the service container and include an "alias" attribute: * * * * * * * A constraint may then return this alias in its validatedBy() method: * * public function validatedBy() * { * return 'some_alias'; * } * * @author Kris Wallsmith */ class ConstraintValidatorFactory implements ConstraintValidatorFactoryInterface { protected $container; protected $validators; /** * @param ContainerInterface $container The service container * @param array $validators An array of validators */ public function __construct(ContainerInterface $container, array $validators = array()) { $this->container = $container; $this->validators = $validators; } /** * Returns the validator for the supplied constraint. * * @return ConstraintValidatorInterface A validator for the supplied constraint * * @throws ValidatorException When the validator class does not exist * @throws UnexpectedTypeException When the validator is not an instance of ConstraintValidatorInterface */ public function getInstance(Constraint $constraint) { $name = $constraint->validatedBy(); if (!isset($this->validators[$name])) { if (!class_exists($name)) { throw new ValidatorException(sprintf('Constraint validator "%s" does not exist or it is not enabled. Check the "validatedBy" method in your constraint class "%s".', $name, \get_class($constraint))); } $this->validators[$name] = new $name(); } elseif (\is_string($this->validators[$name])) { $this->validators[$name] = $this->container->get($this->validators[$name]); } if (!$this->validators[$name] instanceof ConstraintValidatorInterface) { throw new UnexpectedTypeException($this->validators[$name], 'Symfony\Component\Validator\ConstraintValidatorInterface'); } return $this->validators[$name]; } }