From 5003395ae7851f77d5f7674410d212a4dae5892c Mon Sep 17 00:00:00 2001 From: David Wolter Date: Tue, 6 Oct 2015 11:48:16 +0200 Subject: [PATCH 1/2] [FrameworkBundle] add "mapping" configuration key at validation section to define extra validation files or directories which are not in the 'Bundle*/Resources/config' directory. --- .../DependencyInjection/Configuration.php | 15 ++++ .../FrameworkExtension.php | 85 ++++++++++++++----- .../DependencyInjection/ConfigurationTest.php | 4 + .../Fixtures/php/validation_mapping_dirs.php | 9 ++ .../Fixtures/php/validation_mapping_files.php | 9 ++ .../Fixtures/xml/validation_mapping_dirs.xml | 14 +++ .../Fixtures/xml/validation_mapping_files.xml | 14 +++ .../Fixtures/yml/validation_mapping_dirs.yml | 5 ++ .../Fixtures/yml/validation_mapping_files.yml | 5 ++ .../FrameworkExtensionTest.php | 23 +++++ 10 files changed, 161 insertions(+), 22 deletions(-) create mode 100644 src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/validation_mapping_dirs.php create mode 100644 src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/validation_mapping_files.php create mode 100644 src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/validation_mapping_dirs.xml create mode 100644 src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/validation_mapping_files.xml create mode 100644 src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/validation_mapping_dirs.yml create mode 100644 src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/validation_mapping_files.yml 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..f9838290173b2 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)); } } + } + + /** + * 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); + } - return $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'); From 31964c0ff4e6f1b00ecb30ce6bfd6e15c52653b8 Mon Sep 17 00:00:00 2001 From: David Wolter Date: Tue, 6 Oct 2015 11:53:12 +0200 Subject: [PATCH 2/2] cs fix --- .../DependencyInjection/FrameworkExtension.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index f9838290173b2..984e80047d215 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -832,8 +832,8 @@ private function getValidatorMappingFiles(ContainerBuilder $container, array &$f /** * 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 + * @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) { @@ -845,8 +845,8 @@ private function getValidatorMappingFilesFromDir($dir, array &$files) /** * Get all validation files from config. * - * @param array $config A validation configuration array - * @param array $files A array reference of validation files + * @param array $config A validation configuration array + * @param array $files A array reference of validation files */ private function getValidatorMappingFilesFromConfig(array $config, array &$files) { 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