diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php index c14399c0c6504..89df8fd493637 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php @@ -623,6 +623,21 @@ private function addValidationSection(ArrayNodeDefinition $rootNode) ->then(function ($v) { return (string) $v; }) ->end() ->end() + ->arrayNode('mapping') + ->addDefaultsIfNotSet() + ->fixXmlConfig('file') + ->fixXmlConfig('dir') + ->children() + ->arrayNode('files') + ->prototype('scalar')->end() + ->end() + ->end() + ->children() + ->arrayNode('dirs') + ->prototype('scalar')->end() + ->end() + ->end() + ->end() ->end() ->end() ->end() diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index 08a7b12de4eb1..984e80047d215 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -752,13 +752,16 @@ private function registerValidationConfiguration(array $config, ContainerBuilder $container->setParameter('validator.translation_domain', $config['translation_domain']); - list($xmlMappings, $yamlMappings) = $this->getValidatorMappingFiles($container); - if (count($xmlMappings) > 0) { - $validatorBuilder->addMethodCall('addXmlMappings', array($xmlMappings)); + $files = array('xml' => array(), 'yml' => array()); + $this->getValidatorMappingFiles($container, $files); + $this->getValidatorMappingFilesFromConfig($config, $files); + + if (!empty($files['xml'])) { + $validatorBuilder->addMethodCall('addXmlMappings', array($files['xml'])); } - if (count($yamlMappings) > 0) { - $validatorBuilder->addMethodCall('addYamlMappings', array($yamlMappings)); + if (!empty($files['yml'])) { + $validatorBuilder->addMethodCall('addYamlMappings', array($files['yml'])); } $definition = $container->findDefinition('validator.email'); @@ -790,14 +793,18 @@ private function registerValidationConfiguration(array $config, ContainerBuilder $container->setParameter('validator.api', '2.5-bc'); } - private function getValidatorMappingFiles(ContainerBuilder $container) + /** + * Get all validation files. + * + * @param ContainerBuilder $container A ContainerBuilder instance + * @param array $files A array reference of validation files + */ + private function getValidatorMappingFiles(ContainerBuilder $container, array &$files) { - $files = array(array(), array()); - if (interface_exists('Symfony\Component\Form\FormInterface')) { $reflClass = new \ReflectionClass('Symfony\Component\Form\FormInterface'); - $files[0][] = dirname($reflClass->getFileName()).'/Resources/config/validation.xml'; - $container->addResource(new FileResource($files[0][0])); + $files['xml'][] = $file = dirname($reflClass->getFileName()).'/Resources/config/validation.xml'; + $container->addResource(new FileResource($file)); } $bundles = $container->getParameter('kernel.bundles'); @@ -805,29 +812,63 @@ private function getValidatorMappingFiles(ContainerBuilder $container) $reflection = new \ReflectionClass($bundle); $dirname = dirname($reflection->getFileName()); - if (is_file($file = $dirname.'/Resources/config/validation.xml')) { - $files[0][] = realpath($file); + if (is_file($file = $dirname.'/Resources/config/validation.yml')) { + $files['yml'][] = realpath($file); $container->addResource(new FileResource($file)); } - if (is_file($file = $dirname.'/Resources/config/validation.yml')) { - $files[1][] = realpath($file); + if (is_file($file = $dirname.'/Resources/config/validation.xml')) { + $files['xml'][] = realpath($file); $container->addResource(new FileResource($file)); } if (is_dir($dir = $dirname.'/Resources/config/validation')) { - foreach (Finder::create()->files()->in($dir)->name('*.xml') as $file) { - $files[0][] = $file->getRealpath(); - } - foreach (Finder::create()->files()->in($dir)->name('*.yml') as $file) { - $files[1][] = $file->getRealpath(); - } - + $this->getValidatorMappingFilesFromDir($dir, $files); $container->addResource(new DirectoryResource($dir)); } } + } - return $files; + /** + * Search for validation files in directory. + * + * @param string $dir The directory that contains the validation files + * @param array $files A array reference of validation files + */ + private function getValidatorMappingFilesFromDir($dir, array &$files) + { + foreach (Finder::create()->files()->in($dir)->name('/\.xml|yml$/') as $file) { + $files[$file->getExtension()][] = $file->getRealpath(); + } + } + + /** + * Get all validation files from config. + * + * @param array $config A validation configuration array + * @param array $files A array reference of validation files + */ + private function getValidatorMappingFilesFromConfig(array $config, array &$files) + { + foreach ($config['mapping']['dirs'] as $dir) { + if (!is_dir($dir)) { + throw new \RuntimeException(sprintf('Could not open directory "%s".', $dir)); + } + $this->getValidatorMappingFilesFromDir($dir, $files); + } + + foreach ($config['mapping']['files'] as $file) { + if (!is_file($file)) { + throw new \RuntimeException(sprintf('Could not load file "%s".', $file)); + } + + $ext = substr($file, -3); + if ($ext !== 'xml' && $ext !== 'yml') { + throw new \RuntimeException(sprintf('Unsupported mapping type in "%s", supported types are XML & Yaml.', $file)); + } + + $files[$ext][] = realpath($file); + } } private function registerAnnotationsConfiguration(array $config, ContainerBuilder $container, $loader) diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php index f8bb4cb2fc735..0e245e5cc5211 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php @@ -164,6 +164,10 @@ protected static function getBundleDefaultConfig() 'static_method' => array('loadValidatorMetadata'), 'translation_domain' => 'validators', 'strict_email' => false, + 'mapping' => array( + 'files' => array(), + 'dirs' => array(), + ), ), 'annotations' => array( 'cache' => 'file', diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/validation_mapping_dirs.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/validation_mapping_dirs.php new file mode 100644 index 0000000000000..2ce9787c4ea3e --- /dev/null +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/validation_mapping_dirs.php @@ -0,0 +1,9 @@ +loadFromExtension('framework', array( + 'validation' => array( + 'mapping' => array( + 'dirs' => array('%kernel.root_dir%/Fixtures/TestBundle/Resources/config'), + ), + ), +)); diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/validation_mapping_files.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/validation_mapping_files.php new file mode 100644 index 0000000000000..37133c1500fcf --- /dev/null +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/validation_mapping_files.php @@ -0,0 +1,9 @@ +loadFromExtension('framework', array( + 'validation' => array( + 'mapping' => array( + 'files' => array('%kernel.root_dir%/Fixtures/TestBundle/Resources/config/validation.yml'), + ), + ), +)); diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/validation_mapping_dirs.xml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/validation_mapping_dirs.xml new file mode 100644 index 0000000000000..ea6d0363c433a --- /dev/null +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/validation_mapping_dirs.xml @@ -0,0 +1,14 @@ + + + + + + + + %kernel.root_dir%/Fixtures/TestBundle/Resources/config + + + + diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/validation_mapping_files.xml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/validation_mapping_files.xml new file mode 100644 index 0000000000000..e24a86638e880 --- /dev/null +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/validation_mapping_files.xml @@ -0,0 +1,14 @@ + + + + + + + + %kernel.root_dir%/Fixtures/TestBundle/Resources/config/validation.yml + + + + diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/validation_mapping_dirs.yml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/validation_mapping_dirs.yml new file mode 100644 index 0000000000000..07daa290cac90 --- /dev/null +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/validation_mapping_dirs.yml @@ -0,0 +1,5 @@ +framework: + validation: + mapping: + dirs: + - "%kernel.root_dir%/Fixtures/TestBundle/Resources/config" diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/validation_mapping_files.yml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/validation_mapping_files.yml new file mode 100644 index 0000000000000..48a26ab76b6e5 --- /dev/null +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/validation_mapping_files.yml @@ -0,0 +1,5 @@ +framework: + validation: + mapping: + files: + - "%kernel.root_dir%/Fixtures/TestBundle/Resources/config/validation.yml" diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php index db8c8cd689f3f..415621bd76b15 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php @@ -383,6 +383,29 @@ public function testValidationNoStaticMethod() // no cache, no annotations, no static methods } + public function testValidationMappingFiles() + { + $container = $this->createContainerFromFile('validation_mapping_files'); + + $calls = $container->getDefinition('validator.builder')->getMethodCalls(); + + $this->assertSame('addYamlMappings', $calls[4][0]); + $this->assertCount(1, $calls[4][1][0]); + } + + public function testValidationMappingDirs() + { + $container = $this->createContainerFromFile('validation_mapping_dirs'); + + $calls = $container->getDefinition('validator.builder')->getMethodCalls(); + + $this->assertSame('addXmlMappings', $calls[3][0]); + $this->assertCount(2, $calls[3][1][0]); + + $this->assertSame('addYamlMappings', $calls[4][0]); + $this->assertCount(1, $calls[4][1][0]); + } + public function testFormsCanBeEnabledWithoutCsrfProtection() { $container = $this->createContainerFromFile('form_no_csrf'); pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy