2015-08-18 00:00:26 +00:00
< ? php
/*
* This file is part of the Symfony package .
*
* ( c ) Fabien Potencier < fabien @ symfony . com >
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
namespace Symfony\Component\Validator ;
use Doctrine\Common\Annotations\AnnotationReader ;
use Doctrine\Common\Annotations\CachedReader ;
use Doctrine\Common\Annotations\Reader ;
use Doctrine\Common\Cache\ArrayCache ;
use Symfony\Component\Translation\IdentityTranslator ;
use Symfony\Component\Translation\TranslatorInterface ;
use Symfony\Component\Validator\Context\ExecutionContextFactory ;
use Symfony\Component\Validator\Exception\ValidatorException ;
use Symfony\Component\Validator\Mapping\Cache\CacheInterface ;
use Symfony\Component\Validator\Mapping\Factory\LazyLoadingMetadataFactory ;
2018-11-23 12:29:20 +00:00
use Symfony\Component\Validator\Mapping\Factory\MetadataFactoryInterface ;
2015-08-18 00:00:26 +00:00
use Symfony\Component\Validator\Mapping\Loader\AnnotationLoader ;
use Symfony\Component\Validator\Mapping\Loader\LoaderChain ;
2018-11-23 12:29:20 +00:00
use Symfony\Component\Validator\Mapping\Loader\LoaderInterface ;
2015-08-18 00:00:26 +00:00
use Symfony\Component\Validator\Mapping\Loader\StaticMethodLoader ;
use Symfony\Component\Validator\Mapping\Loader\XmlFileLoader ;
use Symfony\Component\Validator\Mapping\Loader\YamlFileLoader ;
use Symfony\Component\Validator\Validator\RecursiveValidator ;
/**
* The default implementation of { @ link ValidatorBuilderInterface } .
*
* @ author Bernhard Schussek < bschussek @ gmail . com >
*/
class ValidatorBuilder implements ValidatorBuilderInterface
{
private $initializers = array ();
private $xmlMappings = array ();
private $yamlMappings = array ();
private $methodMappings = array ();
/**
* @ var Reader | null
*/
private $annotationReader ;
/**
* @ var MetadataFactoryInterface | null
*/
private $metadataFactory ;
/**
* @ var ConstraintValidatorFactoryInterface | null
*/
private $validatorFactory ;
/**
* @ var CacheInterface | null
*/
private $metadataCache ;
/**
* @ var TranslatorInterface | null
*/
private $translator ;
/**
2018-11-23 12:29:20 +00:00
* @ var string | null
2015-08-18 00:00:26 +00:00
*/
private $translationDomain ;
/**
* { @ inheritdoc }
*/
public function addObjectInitializer ( ObjectInitializerInterface $initializer )
{
$this -> initializers [] = $initializer ;
return $this ;
}
/**
* { @ inheritdoc }
*/
public function addObjectInitializers ( array $initializers )
{
$this -> initializers = array_merge ( $this -> initializers , $initializers );
return $this ;
}
/**
* { @ inheritdoc }
*/
public function addXmlMapping ( $path )
{
if ( null !== $this -> metadataFactory ) {
throw new ValidatorException ( 'You cannot add custom mappings after setting a custom metadata factory. Configure your metadata factory instead.' );
}
$this -> xmlMappings [] = $path ;
return $this ;
}
/**
* { @ inheritdoc }
*/
public function addXmlMappings ( array $paths )
{
if ( null !== $this -> metadataFactory ) {
throw new ValidatorException ( 'You cannot add custom mappings after setting a custom metadata factory. Configure your metadata factory instead.' );
}
$this -> xmlMappings = array_merge ( $this -> xmlMappings , $paths );
return $this ;
}
/**
* { @ inheritdoc }
*/
public function addYamlMapping ( $path )
{
if ( null !== $this -> metadataFactory ) {
throw new ValidatorException ( 'You cannot add custom mappings after setting a custom metadata factory. Configure your metadata factory instead.' );
}
$this -> yamlMappings [] = $path ;
return $this ;
}
/**
* { @ inheritdoc }
*/
public function addYamlMappings ( array $paths )
{
if ( null !== $this -> metadataFactory ) {
throw new ValidatorException ( 'You cannot add custom mappings after setting a custom metadata factory. Configure your metadata factory instead.' );
}
$this -> yamlMappings = array_merge ( $this -> yamlMappings , $paths );
return $this ;
}
/**
* { @ inheritdoc }
*/
public function addMethodMapping ( $methodName )
{
if ( null !== $this -> metadataFactory ) {
throw new ValidatorException ( 'You cannot add custom mappings after setting a custom metadata factory. Configure your metadata factory instead.' );
}
$this -> methodMappings [] = $methodName ;
return $this ;
}
/**
* { @ inheritdoc }
*/
public function addMethodMappings ( array $methodNames )
{
if ( null !== $this -> metadataFactory ) {
throw new ValidatorException ( 'You cannot add custom mappings after setting a custom metadata factory. Configure your metadata factory instead.' );
}
$this -> methodMappings = array_merge ( $this -> methodMappings , $methodNames );
return $this ;
}
/**
* { @ inheritdoc }
*/
public function enableAnnotationMapping ( Reader $annotationReader = null )
{
if ( null !== $this -> metadataFactory ) {
throw new ValidatorException ( 'You cannot enable annotation mapping after setting a custom metadata factory. Configure your metadata factory instead.' );
}
if ( null === $annotationReader ) {
if ( ! class_exists ( 'Doctrine\Common\Annotations\AnnotationReader' ) || ! class_exists ( 'Doctrine\Common\Cache\ArrayCache' )) {
throw new \RuntimeException ( 'Enabling annotation based constraint mapping requires the packages doctrine/annotations and doctrine/cache to be installed.' );
}
$annotationReader = new CachedReader ( new AnnotationReader (), new ArrayCache ());
}
$this -> annotationReader = $annotationReader ;
return $this ;
}
/**
* { @ inheritdoc }
*/
public function disableAnnotationMapping ()
{
$this -> annotationReader = null ;
return $this ;
}
/**
* { @ inheritdoc }
*/
public function setMetadataFactory ( MetadataFactoryInterface $metadataFactory )
{
2018-11-23 12:29:20 +00:00
if ( \count ( $this -> xmlMappings ) > 0 || \count ( $this -> yamlMappings ) > 0 || \count ( $this -> methodMappings ) > 0 || null !== $this -> annotationReader ) {
2015-08-18 00:00:26 +00:00
throw new ValidatorException ( 'You cannot set a custom metadata factory after adding custom mappings. You should do either of both.' );
}
$this -> metadataFactory = $metadataFactory ;
return $this ;
}
/**
* { @ inheritdoc }
*/
public function setMetadataCache ( CacheInterface $cache )
{
if ( null !== $this -> metadataFactory ) {
throw new ValidatorException ( 'You cannot set a custom metadata cache after setting a custom metadata factory. Configure your metadata factory instead.' );
}
$this -> metadataCache = $cache ;
return $this ;
}
/**
* { @ inheritdoc }
*/
public function setConstraintValidatorFactory ( ConstraintValidatorFactoryInterface $validatorFactory )
{
$this -> validatorFactory = $validatorFactory ;
return $this ;
}
/**
* { @ inheritdoc }
*/
public function setTranslator ( TranslatorInterface $translator )
{
$this -> translator = $translator ;
return $this ;
}
/**
* { @ inheritdoc }
*/
public function setTranslationDomain ( $translationDomain )
{
$this -> translationDomain = $translationDomain ;
return $this ;
}
/**
2018-11-23 12:29:20 +00:00
* @ return LoaderInterface []
2015-08-18 00:00:26 +00:00
*/
2018-11-23 12:29:20 +00:00
public function getLoaders ()
2015-08-18 00:00:26 +00:00
{
2018-11-23 12:29:20 +00:00
$loaders = array ();
2015-08-18 00:00:26 +00:00
2018-11-23 12:29:20 +00:00
foreach ( $this -> xmlMappings as $xmlMapping ) {
$loaders [] = new XmlFileLoader ( $xmlMapping );
2015-08-18 00:00:26 +00:00
}
2018-11-23 12:29:20 +00:00
foreach ( $this -> yamlMappings as $yamlMappings ) {
$loaders [] = new YamlFileLoader ( $yamlMappings );
}
2015-08-18 00:00:26 +00:00
2018-11-23 12:29:20 +00:00
foreach ( $this -> methodMappings as $methodName ) {
$loaders [] = new StaticMethodLoader ( $methodName );
}
2015-08-18 00:00:26 +00:00
2018-11-23 12:29:20 +00:00
if ( $this -> annotationReader ) {
$loaders [] = new AnnotationLoader ( $this -> annotationReader );
2015-08-18 00:00:26 +00:00
}
2018-11-23 12:29:20 +00:00
return $loaders ;
2015-08-18 00:00:26 +00:00
}
/**
* { @ inheritdoc }
*/
public function getValidator ()
{
$metadataFactory = $this -> metadataFactory ;
if ( ! $metadataFactory ) {
2018-11-23 12:29:20 +00:00
$loaders = $this -> getLoaders ();
2015-08-18 00:00:26 +00:00
$loader = null ;
2018-11-23 12:29:20 +00:00
if ( \count ( $loaders ) > 1 ) {
2015-08-18 00:00:26 +00:00
$loader = new LoaderChain ( $loaders );
2018-11-23 12:29:20 +00:00
} elseif ( 1 === \count ( $loaders )) {
2015-08-18 00:00:26 +00:00
$loader = $loaders [ 0 ];
}
$metadataFactory = new LazyLoadingMetadataFactory ( $loader , $this -> metadataCache );
}
2018-11-23 12:29:20 +00:00
$validatorFactory = $this -> validatorFactory ? : new ConstraintValidatorFactory ();
2015-08-18 00:00:26 +00:00
$translator = $this -> translator ;
if ( null === $translator ) {
$translator = new IdentityTranslator ();
// Force the locale to be 'en' when no translator is provided rather than relying on the Intl default locale
// This avoids depending on Intl or the stub implementation being available. It also ensures that Symfony
// validation messages are pluralized properly even when the default locale gets changed because they are in
// English.
$translator -> setLocale ( 'en' );
}
$contextFactory = new ExecutionContextFactory ( $translator , $this -> translationDomain );
return new RecursiveValidator ( $contextFactory , $metadataFactory , $validatorFactory , $this -> initializers );
}
}