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 @@
+
+
+
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: