diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php new file mode 100644 index 0000000000..418a754414 --- /dev/null +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php @@ -0,0 +1,220 @@ + + */ +class Configuration +{ + /** + * Generates the configuration tree. + * + * @param boolean $kernelDebug The kernel.debug DIC parameter + * @return \Symfony\Component\DependencyInjection\Configuration\NodeInterface + */ + public function getConfigTree($kernelDebug) + { + $treeBuilder = new TreeBuilder(); + $rootNode = $treeBuilder->root('app:config', 'array'); + + $rootNode + ->scalarNode('cache_warmer')->defaultValue(!$kernelDebug)->end() + ->scalarNode('charset')->end() + ->scalarNode('document_root')->end() + ->scalarNode('error_handler')->end() + ->scalarNode('ide')->end() + ->booleanNode('test')->end() + ; + + $this->addCsrfProtectionSection($rootNode); + $this->addEsiSection($rootNode); + $this->addProfilerSection($rootNode); + $this->addRouterSection($rootNode); + $this->addSessionSection($rootNode); + $this->addTemplatingSection($rootNode); + $this->addTranslatorSection($rootNode); + $this->addValidationSection($rootNode); + + return $treeBuilder->buildTree(); + } + + private function addCsrfProtectionSection(NodeBuilder $rootNode) + { + $rootNode + ->arrayNode('csrf_protection') + ->canBeUnset() + ->treatNullLike(array('enabled' => true)) + ->treatTrueLike(array('enabled' => true)) + ->booleanNode('enabled')->end() + ->scalarNode('field_name')->end() + ->scalarNode('secret')->end() + ->end() + ; + } + + private function addEsiSection(NodeBuilder $rootNode) + { + $rootNode + ->arrayNode('esi') + ->canBeUnset() + ->treatNullLike(array('enabled' => true)) + ->treatTrueLike(array('enabled' => true)) + ->booleanNode('enabled')->end() + ->end() + ; + } + + private function addProfilerSection(NodeBuilder $rootNode) + { + $rootNode + ->arrayNode('profiler') + ->canBeUnset() + ->treatNullLike(array()) + ->treatTrueLike(array()) + ->booleanNode('only_exceptions')->end() + ->arrayNode('matcher') + ->canBeUnset() + ->scalarNode('ip')->end() + ->scalarNode('path')->end() + ->scalarNode('service')->end() + ->end() + ->end() + ; + } + + private function addRouterSection(NodeBuilder $rootNode) + { + $rootNode + ->arrayNode('router') + ->canBeUnset() + ->scalarNode('cache_warmer')->end() + ->scalarNode('resource')->isRequired()->end() + ->end() + ; + } + + private function addSessionSection(NodeBuilder $rootNode) + { + $rootNode + ->arrayNode('session') + ->canBeUnset() + ->treatNullLike(array()) + ->treatTrueLike(array()) + // Strip "pdo." prefix from option keys, since dots cannot appear in node names + ->beforeNormalization() + ->ifArray() + ->then(function($v){ + foreach ($v as $key => $value) { + if (0 === strncmp('pdo.', $key, 4)) { + $v[substr($key, 4)] = $value; + unset($v[$key]); + } + } + return $v; + }) + ->end() + ->booleanNode('auto_start')->end() + ->scalarNode('class')->end() + ->scalarNode('default_locale')->end() + ->scalarNode('storage_id')->defaultValue('native')->end() + // NativeSessionStorage options + ->scalarNode('name')->end() + ->scalarNode('lifetime')->end() + ->scalarNode('path')->end() + ->scalarNode('domain')->end() + ->booleanNode('secure')->end() + ->booleanNode('httponly')->end() + // PdoSessionStorage options + ->scalarNode('db_table')->end() + ->scalarNode('db_id_col')->end() + ->scalarNode('db_data_col')->end() + ->scalarNode('db_time_col')->end() + ->end() + ; + } + + private function addTemplatingSection(NodeBuilder $rootNode) + { + $rootNode + ->arrayNode('templating') + ->canBeUnset() + ->scalarNode('assets_version')->end() + ->scalarNode('assets_base_urls')->end() + ->scalarNode('cache')->end() + ->scalarNode('cache_warmer')->end() + ->fixXmlConfig('engine') + ->arrayNode('engines') + ->requiresAtLeastOneElement() + ->beforeNormalization() + ->ifTrue(function($v){ return !is_array($v); }) + ->then(function($v){ return array($v); }) + ->end() + ->prototype('scalar') + ->beforeNormalization() + ->ifTrue(function($v) { return is_array($v) && isset($v['id']); }) + ->then(function($v){ return $v['id']; }) + ->end() + ->end() + ->end() + ->fixXmlConfig('loader') + ->arrayNode('loaders') + ->beforeNormalization() + ->ifTrue(function($v){ return !is_array($v); }) + ->then(function($v){ return array($v); }) + ->end() + ->prototype('scalar')->end() + ->end() + ->end() + ; + } + + private function addTranslatorSection(NodeBuilder $rootNode) + { + $rootNode + ->arrayNode('translator') + ->canBeUnset() + ->booleanNode('enabled')->defaultTrue()->end() + ->scalarNode('fallback')->end() + ->end() + ; + } + + private function addValidationSection(NodeBuilder $rootNode) + { + $rootNode + ->arrayNode('validation') + ->canBeUnset() + // For XML, namespace is a child of validation, so it must be moved under annotations + ->beforeNormalization() + ->ifTrue(function($v) { return is_array($v) && !empty($v['annotations']) && !empty($v['namespace']); }) + ->then(function($v){ + $v['annotations'] = array('namespace' => $v['namespace']); + return $v; + }) + ->end() + ->booleanNode('enabled')->end() + ->arrayNode('annotations') + ->canBeUnset() + ->treatNullLike(array()) + ->treatTrueLike(array()) + ->fixXmlConfig('namespace') + ->arrayNode('namespaces') + ->containsNameValuePairsWithKeyAttribute('prefix') + ->prototype('scalar') + ->beforeNormalization() + ->ifTrue(function($v) { return is_array($v) && isset($v['namespace']); }) + ->then(function($v){ return $v['namespace']; }) + ->end() + ->end() + ->end() + ->end() + ->end() + ; + } +} diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index 2860623241..411835221d 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -15,10 +15,10 @@ use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\Parameter; use Symfony\Component\DependencyInjection\Reference; +use Symfony\Component\DependencyInjection\Configuration\Processor; use Symfony\Component\DependencyInjection\Loader\XmlFileLoader; use Symfony\Component\DependencyInjection\Resource\FileResource; use Symfony\Component\Finder\Finder; -use Symfony\Component\HttpFoundation\RequestMatcher; use Symfony\Component\HttpKernel\DependencyInjection\Extension; /** @@ -43,16 +43,23 @@ class FrameworkExtension extends Extension $loader->load('form.xml'); $loader->load('services.xml'); + // A translator must always be registered (as support is included by + // default in the Form component). If disabled, an identity translator + // will be used and everything will still work as expected. + $loader->load('translation.xml'); + if ($container->getParameter('kernel.debug')) { $loader->load('debug.xml'); $container->setDefinition('event_dispatcher', $container->findDefinition('debug.event_dispatcher')); $container->setAlias('debug.event_dispatcher', 'event_dispatcher'); } - $config = $this->mergeConfigs($configs); + $processor = new Processor(); + $configuration = new Configuration(); - $warmer = isset($config['cache_warmer']) ? $config['cache_warmer'] : !$container->getParameter('kernel.debug'); - $container->setParameter('kernel.cache_warmup', $warmer); + $config = $processor->process($configuration->getConfigTree($container->getParameter('kernel.debug')), $configs); + + $container->setParameter('kernel.cache_warmup', $config['cache_warmer']); if (isset($config['charset'])) { $container->setParameter('kernel.charset', $config['charset']); @@ -80,19 +87,42 @@ class FrameworkExtension extends Extension $container->setParameter('debug.file_link_format', $pattern); } - if ($config['test']) { + if (isset($config['test']) && $config['test']) { $loader->load('test.xml'); $config['session']['storage_id'] = 'array'; } - $this->registerCsrfProtectionConfiguration($config['csrf_protection'], $container); - $this->registerEsiConfiguration($config['esi'], $loader); - $this->registerProfilerConfiguration($config['profiler'], $container, $loader); - $this->registerRouterConfiguration($config['router'], $container, $loader); - $this->registerSessionConfiguration($config['session'], $container, $loader); - $this->registerTemplatingConfiguration($config['templating'], $container, $loader); - $this->registerTranslatorConfiguration($config['translator'], $container, $loader); - $this->registerValidationConfiguration($config['validation'], $container, $loader); + if (isset($config['csrf_protection'])) { + $this->registerCsrfProtectionConfiguration($config['csrf_protection'], $container); + } + + if (isset($config['esi'])) { + $this->registerEsiConfiguration($config['esi'], $loader); + } + + if (isset($config['profiler'])) { + $this->registerProfilerConfiguration($config['profiler'], $container, $loader); + } + + if (isset($config['router'])) { + $this->registerRouterConfiguration($config['router'], $container, $loader); + } + + if (isset($config['session'])) { + $this->registerSessionConfiguration($config['session'], $container, $loader); + } + + if (isset($config['templating'])) { + $this->registerTemplatingConfiguration($config['templating'], $container, $loader); + } + + if (isset($config['translator'])) { + $this->registerTranslatorConfiguration($config['translator'], $container); + } + + if (isset($config['validation'])) { + $this->registerValidationConfiguration($config['validation'], $container, $loader); + } $this->addClassesToCompile(array( 'Symfony\\Component\\HttpFoundation\\ParameterBag', @@ -119,195 +149,13 @@ class FrameworkExtension extends Extension )); } - /** - * Merges a set of configuration arrays and returns the result. - * - * This method internally specifies the available options and their - * default values. Given an array of configuration arrays, this method - * intelligently merges those configuration values and returns the final, - * flattened product. - * - * @param array $configs An array of configuration arrays to merge - * @return array The merged configuration array - */ - protected function mergeConfigs(array $configs) - { - $defaultOptions = array( - 'cache_warmer' => null, - 'charset' => null, - 'csrf_protection' => array( - 'enabled' => null, - 'field_name' => null, - 'secret' => null, - ), - 'document_root' => null, - 'error_handler' => null, - // TODO: consolidate into a scalar unless future options are planned - 'esi' => array( - 'enabled' => null, - ), - 'ide' => null, - 'profiler' => array( - 'enabled' => false, - 'only_exceptions' => null, - 'matcher' => array( - 'ip' => null, - 'path' => null, - 'service' => null, - ), - ), - 'router' => array( - 'cache_warmer' => null, - 'resource' => null, - ), - 'session' => array( - 'auto_start' => null, - 'class' => null, - 'default_locale' => null, - 'storage_id' => 'native', - // NativeSessionStorage options - 'name' => null, - 'lifetime' => null, - 'path' => null, - 'domain' => null, - 'secure' => null, - 'httponly' => null, - // PdoSessionStorage options - 'pdo.db_table' => null, - 'pdo.db_id_col' => null, - 'pdo.db_data_col' => null, - 'pdo.db_time_col' => null, - ), - 'templating' => array( - 'assets_version' => null, - 'assets_base_urls' => null, - 'cache' => null, - 'cache_warmer' => null, - 'engines' => array(), - 'loaders' => array(), - ), - 'test' => null, - 'translator' => array( - 'enabled' => null, - 'fallback' => null, - ), - 'validation' => array( - 'enabled' => null, - 'annotations' => null, - 'namespaces' => array(), - ), - ); - - $mergedConfig = $defaultOptions; - - foreach ($configs as $config) { - $config = $this->normalizeKeys($config); - - if (isset($config['profiler'])) { - $config['profiler']['enabled'] = true; - } - - if (isset($config['templating']) && is_array($config['templating'])) { - $config['templating']['engines'] = $this->normalizeConfig($config['templating'], 'engine'); - $config['templating']['loaders'] = $this->normalizeConfig($config['templating'], 'loader'); - unset($config['templating']['engine'], $config['templating']['loader']); - } - - if (isset($config['validation']) && is_array($config['validation'])) { - $config['validation']['namespaces'] = $this->normalizeConfig($config['validation'], 'namespace'); - unset($config['validation']['namespace']); - } - - $mergedConfig = $this->mergeOptions($mergedConfig, $config, $defaultOptions); - } - - return $mergedConfig; - } - - /** - * Merges a single level of configuration options. - * - * @param array $current The value of the options before merging - * @param array $new The new values to be merged - * @param array $default The corresponding default values for the option level - * @param string $basePath Base property path for the option level - * @return array The merged options - * @throws InvalidArgumentException When an unsupported is found - */ - protected function mergeOptions(array $current, array $new, array $default, $basePath = null) - { - if ($unsupportedOptions = array_diff_key($new, $default)) { - throw new \InvalidArgumentException('The following options are not supported: '.implode(', ', array_keys($unsupportedOptions))); - } - - foreach ($default as $key => $defaultValue) { - if (array_key_exists($key, $new)) { - $optionPath = $basePath ? $basePath.'.'.$key : $key; - $current[$key] = $this->mergeOptionValue($current[$key], $new[$key], $defaultValue, $optionPath); - } - } - - return $current; - } - - /** - * Merges an option value. - * - * @param mixed $current The value of the option before merging - * @param mixed $new The new value to be merged - * @param mixed $default The corresponding default value for the option - * @param string $optionPath Property path for the option - * @return mixed The merged value - * @throws InvalidArgumentException When an invalid option is found - */ - protected function mergeOptionValue($current, $new, $defaultValue, $optionPath) - { - // Allow profiler.matcher array to be overridden with any value. This - // option requires no merge logic and would not benefit from the type - // validation below. - if ('profiler.matcher' === $optionPath) { - return $new; - } - - // Ensure that the new value's type is an array if expected - if (is_array($defaultValue) && !is_array($new)) { - throw new \InvalidArgumentException(sprintf('Expected array type for option "%s", %s given', $optionPath, gettype($new))); - } - - switch ($optionPath) { - // Engine options are arrays of strings, although XML configurations - // store the engine ID in an attribute. Dedupe after merging. - case 'templating.engines': - $new = array_map(function($engine) { return is_array($engine) ? $engine['id'] : $engine; }, $new); - return array_unique(array_merge($current, $new)); - - // Loader options are arrays of strings, so dedupe after merging - case 'templating.loaders': - return array_unique(array_merge($current, $new)); - - // The namespace options' keys are used for the annotation prefix - // and are significant, so do not dedupe array values. Be mindful - // of XML configurations, which store the prefix in an attribute. - case 'validation.namespaces': - foreach ($new as $prefix => $namespace) { - if (is_array($namespace)) { - $new[$namespace['prefix']] = $namespace['namespace']; - unset($new[$prefix]); - } - } - return array_merge($current, $new); - } - - return is_array($defaultValue) ? $this->mergeOptions($current, $new, $defaultValue, $optionPath) : $new; - } - /** * Loads the CSRF protection configuration. * * @param array $config A CSRF protection configuration array * @param ContainerBuilder $container A ContainerBuilder instance */ - protected function registerCsrfProtectionConfiguration(array $config, ContainerBuilder $container) + private function registerCsrfProtectionConfiguration(array $config, ContainerBuilder $container) { foreach (array('enabled', 'field_name', 'secret') as $key) { if (isset($config[$key])) { @@ -322,9 +170,9 @@ class FrameworkExtension extends Extension * @param array $config An ESI configuration array * @param XmlFileLoader $loader An XmlFileLoader instance */ - protected function registerEsiConfiguration(array $config, XmlFileLoader $loader) + private function registerEsiConfiguration(array $config, XmlFileLoader $loader) { - if ($config['enabled']) { + if (isset($config['enabled']) && $config['enabled']) { $loader->load('esi.xml'); } } @@ -336,12 +184,8 @@ class FrameworkExtension extends Extension * @param ContainerBuilder $container A ContainerBuilder instance * @param XmlFileLoader $loader An XmlFileLoader instance */ - protected function registerProfilerConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader) + private function registerProfilerConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader) { - if (!$config['enabled']) { - return; - } - $loader->load('profiling.xml'); $loader->load('collectors.xml'); @@ -349,7 +193,7 @@ class FrameworkExtension extends Extension $container->setParameter('profiler_listener.only_exceptions', $config['only_exceptions']); } - if ($config['matcher']) { + if (isset($config['matcher'])) { if (isset($config['matcher']['service'])) { $container->setAlias('profiler.request_matcher', $config['matcher']['service']); } elseif (isset($config['matcher']['ip']) || isset($config['matcher']['path'])) { @@ -373,8 +217,9 @@ class FrameworkExtension extends Extension * @param array $config A router configuration array * @param ContainerBuilder $container A ContainerBuilder instance * @param XmlFileLoader $loader An XmlFileLoader instance + * @throws \InvalidArgumentException if resource option is not set */ - protected function registerRouterConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader) + private function registerRouterConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader) { $loader->load('routing.xml'); @@ -384,7 +229,7 @@ class FrameworkExtension extends Extension $container->setParameter('routing.resource', $config['resource']); - if ($config['cache_warmer']) { + if (isset($config['cache_warmer']) && $config['cache_warmer']) { $container->getDefinition('router.cache_warmer')->addTag('kernel.cache_warmer'); $container->setAlias('router', 'router.cached'); } @@ -395,7 +240,7 @@ class FrameworkExtension extends Extension 'Symfony\\Component\\Routing\\Matcher\\UrlMatcher', 'Symfony\\Component\\Routing\\Generator\\UrlGeneratorInterface', 'Symfony\\Component\\Routing\\Generator\\UrlGenerator', - $container->findDefinition('router')->getClass() + $container->findDefinition('router')->getClass(), )); } @@ -406,11 +251,11 @@ class FrameworkExtension extends Extension * @param ContainerBuilder $container A ContainerBuilder instance * @param XmlFileLoader $loader An XmlFileLoader instance */ - protected function registerSessionConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader) + private function registerSessionConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader) { $loader->load('session.xml'); - if ($config['auto_start']) { + if (isset($config['auto_start']) && $config['auto_start']) { $container->getDefinition('session')->addMethodCall('start'); } @@ -425,9 +270,9 @@ class FrameworkExtension extends Extension $container->setAlias('session.storage', 'session.storage.'.$config['storage_id']); $options = $container->getParameter('session.storage.'.$config['storage_id'].'.options'); - foreach (array('name', 'lifetime', 'path', 'domain', 'secure', 'httponly', 'pdo.db_table', 'pdo.db_id_col', 'pdo.db_data_col', 'pdo.db_time_col') as $key) { + foreach (array('name', 'lifetime', 'path', 'domain', 'secure', 'httponly', 'db_table', 'db_id_col', 'db_data_col', 'db_time_col') as $key) { if (isset($config[$key])) { - $options[str_replace('pdo.', '', $key)] = $config[$key]; + $options[$key] = $config[$key]; } } $container->setParameter('session.storage.'.$config['storage_id'].'.options', $options); @@ -445,8 +290,9 @@ class FrameworkExtension extends Extension * @param array $config A templating configuration array * @param ContainerBuilder $container A ContainerBuilder instance * @param XmlFileLoader $loader An XmlFileLoader instance + * @throws \LogicException if no engines are defined */ - protected function registerTemplatingConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader) + private function registerTemplatingConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader) { $loader->load('templating.xml'); $loader->load('templating_php.xml'); @@ -463,7 +309,7 @@ class FrameworkExtension extends Extension $container->setParameter('templating.assets.base_urls', $config['assets_base_urls']); } - if ($config['loaders']) { + if (isset($config['loaders'])) { $loaders = array_map(function($loader) { return new Reference($loader); }, $config['loaders']); // Use a deligation unless only a single loader was registered @@ -475,7 +321,7 @@ class FrameworkExtension extends Extension } } - if ($config['cache']) { + if (isset($config['cache'])) { // Wrap the existing loader with cache (must happen after loaders are registered) $container->setDefinition('templating.loader.wrapped', $container->findDefinition('templating.loader')); $container->setDefinition('templating.loader', $container->getDefinition('templating.loader.cache')); @@ -484,12 +330,12 @@ class FrameworkExtension extends Extension $container->setParameter('templating.loader.cache.path', null); } - if ($config['cache_warmer']) { + if (isset($config['cache_warmer'])) { $container->getDefinition('templating.cache_warmer.template_paths')->addTag('kernel.cache_warmer'); $container->setAlias('templating.locator', 'templating.locator.cached'); } - if (!$config['engines']) { + if (empty($config['engines'])) { throw new \LogicException('You must register at least one templating engine.'); } @@ -523,26 +369,17 @@ class FrameworkExtension extends Extension $container->getDefinition('templating.engine.delegating')->setArgument(1, $engines); $container->setAlias('templating', 'templating.engine.delegating'); } - - } /** * Loads the translator configuration. * - * A translator must always be registered (as support is included by default - * in the forms component). If disabled, an identity translator will be - * used and everything will still work as expected. - * * @param array $config A translator configuration array * @param ContainerBuilder $container A ContainerBuilder instance - * @param XmlFileLoader $loader An XmlFileLoader instance */ - protected function registerTranslatorConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader) + private function registerTranslatorConfiguration(array $config, ContainerBuilder $container) { - $loader->load('translation.xml'); - - if ($config['enabled']) { + if (isset($config['enabled']) && $config['enabled']) { // Use the "real" translator instead of the identity default $container->setDefinition('translator', $container->findDefinition('translator.real')); @@ -585,65 +422,67 @@ class FrameworkExtension extends Extension * @param ContainerBuilder $container A ContainerBuilder instance * @param XmlFileLoader $loader An XmlFileLoader instance */ - protected function registerValidationConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader) + private function registerValidationConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader) { - if ($config['enabled']) { - $loader->load('validator.xml'); + if (empty($config['enabled'])) { + return; + } - $xmlMappingFiles = array(); - $yamlMappingFiles = array(); + $loader->load('validator.xml'); - // Include default entries from the framework - $xmlMappingFiles[] = __DIR__.'/../../../Component/Form/Resources/config/validation.xml'; + $xmlMappingFiles = array(); + $yamlMappingFiles = array(); - foreach ($container->getParameter('kernel.bundles') as $bundle) { - $reflection = new \ReflectionClass($bundle); - if (file_exists($file = dirname($reflection->getFilename()).'/Resources/config/validation.xml')) { - $xmlMappingFiles[] = realpath($file); - } - if (file_exists($file = dirname($reflection->getFilename()).'/Resources/config/validation.yml')) { - $yamlMappingFiles[] = realpath($file); - } + // Include default entries from the framework + $xmlMappingFiles[] = __DIR__.'/../../../Component/Form/Resources/config/validation.xml'; + + foreach ($container->getParameter('kernel.bundles') as $bundle) { + $reflection = new \ReflectionClass($bundle); + if (file_exists($file = dirname($reflection->getFilename()).'/Resources/config/validation.xml')) { + $xmlMappingFiles[] = realpath($file); + } + if (file_exists($file = dirname($reflection->getFilename()).'/Resources/config/validation.yml')) { + $yamlMappingFiles[] = realpath($file); + } + } + + $xmlFilesLoader = new Definition('%validator.mapping.loader.xml_files_loader.class%', array($xmlMappingFiles)); + $xmlFilesLoader->setPublic(false); + + $yamlFilesLoader = new Definition('%validator.mapping.loader.yaml_files_loader.class%', array($yamlMappingFiles)); + $yamlFilesLoader->setPublic(false); + + $container->setDefinition('validator.mapping.loader.xml_files_loader', $xmlFilesLoader); + $container->setDefinition('validator.mapping.loader.yaml_files_loader', $yamlFilesLoader); + + foreach ($xmlMappingFiles as $file) { + $container->addResource(new FileResource($file)); + } + + foreach ($yamlMappingFiles as $file) { + $container->addResource(new FileResource($file)); + } + + if (isset($config['annotations'])) { + // Register prefixes for constraint namespaces + if (!empty($config['annotations']['namespaces'])) { + $container->setParameter('validator.annotations.namespaces', array_merge( + $container->getParameter('validator.annotations.namespaces'), + $config['annotations']['namespaces'] + )); } - $xmlFilesLoader = new Definition('%validator.mapping.loader.xml_files_loader.class%', array($xmlMappingFiles)); - $xmlFilesLoader->setPublic(false); + // Register annotation loader + $annotationLoader = new Definition('%validator.mapping.loader.annotation_loader.class%'); + $annotationLoader->setPublic(false); + $annotationLoader->addArgument(new Parameter('validator.annotations.namespaces')); - $yamlFilesLoader = new Definition('%validator.mapping.loader.yaml_files_loader.class%', array($yamlMappingFiles)); - $yamlFilesLoader->setPublic(false); + $container->setDefinition('validator.mapping.loader.annotation_loader', $annotationLoader); - $container->setDefinition('validator.mapping.loader.xml_files_loader', $xmlFilesLoader); - $container->setDefinition('validator.mapping.loader.yaml_files_loader', $yamlFilesLoader); - - foreach ($xmlMappingFiles as $file) { - $container->addResource(new FileResource($file)); - } - - foreach ($yamlMappingFiles as $file) { - $container->addResource(new FileResource($file)); - } - - if ($config['annotations']) { - // Register prefixes for constraint namespaces - if ($namespaces = $config['namespaces']) { - $container->setParameter('validator.annotations.namespaces', array_merge( - $container->getParameter('validator.annotations.namespaces'), - $namespaces - )); - } - - // Register annotation loader - $annotationLoader = new Definition('%validator.mapping.loader.annotation_loader.class%'); - $annotationLoader->setPublic(false); - $annotationLoader->addArgument(new Parameter('validator.annotations.namespaces')); - - $container->setDefinition('validator.mapping.loader.annotation_loader', $annotationLoader); - - $loaderChain = $container->getDefinition('validator.mapping.loader.loader_chain'); - $arguments = $loaderChain->getArguments(); - array_unshift($arguments[0], new Reference('validator.mapping.loader.annotation_loader')); - $loaderChain->setArguments($arguments); - } + $loaderChain = $container->getDefinition('validator.mapping.loader.loader_chain'); + $arguments = $loaderChain->getArguments(); + array_unshift($arguments[0], new Reference('validator.mapping.loader.annotation_loader')); + $loaderChain->setArguments($arguments); } } diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd b/src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd index a32d10a066..689185a461 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd @@ -63,7 +63,6 @@ - diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/session_pdo.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/session_pdo.php index edeca35e98..eb8deb9d1f 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/session_pdo.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/session_pdo.php @@ -1,9 +1,6 @@ loadFromExtension('app', 'config', array( - 'router' => array( - 'resource' => '%kernel.root_dir%/config/routing.xml', - ), 'session' => array( 'storage_id' => 'pdo', 'pdo.db_table' => 'table', @@ -11,7 +8,4 @@ $container->loadFromExtension('app', 'config', array( 'pdo.db_data_col' => 'data', 'pdo.db_time_col' => 'time', ), - 'templating' => array( - 'engine' => 'php' - ), )); diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/validation_annotations.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/validation_annotations.php index 90de412f32..bed6c991b4 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/validation_annotations.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/validation_annotations.php @@ -1,17 +1,12 @@ loadFromExtension('app', 'config', array( - 'router' => array( - 'resource' => '%kernel.root_dir%/config/routing.xml', - ), 'validation' => array( 'enabled' => true, - 'annotations' => true, - 'namespaces' => array( - 'app' => 'Application\\Validator\\Constraints\\', + 'annotations' => array( + 'namespaces' => array( + 'app' => 'Application\\Validator\\Constraints\\', + ), ), ), - 'templating' => array( - 'engine' => 'php' - ), )); diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/session_pdo.xml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/session_pdo.xml index eeb918e8cc..84455afff6 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/session_pdo.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/session_pdo.xml @@ -7,10 +7,6 @@ http://www.symfony-project.org/schema/dic/symfony http://www.symfony-project.org/schema/dic/symfony/symfony-1.0.xsd"> - - - - diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/validation_annotations.xml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/validation_annotations.xml index 13da91605a..1af18e148f 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/validation_annotations.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/validation_annotations.xml @@ -7,12 +7,8 @@ http://www.symfony-project.org/schema/dic/symfony http://www.symfony-project.org/schema/dic/symfony/symfony-1.0.xsd"> - - - - diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/full.yml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/full.yml index 1aecd8ce48..bb8d3bc3bc 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/full.yml +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/full.yml @@ -28,7 +28,7 @@ app.config: engines: [php, twig] loader: [loader.foo, loader.bar] translator: - enabled: true, + enabled: true fallback: fr validation: enabled: true diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/session_pdo.yml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/session_pdo.yml index ae8f6ad961..06323d53de 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/session_pdo.yml +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/session_pdo.yml @@ -1,11 +1,7 @@ app.config: - router: - resource: %kernel.root_dir%/config/routing.xml session: storage_id: pdo pdo.db_table: table pdo.db_id_col: id pdo.db_data_col: data pdo.db_time_col: time - templating: - engine: php diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/validation_annotations.yml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/validation_annotations.yml index 3b029f6b64..1ff2545fac 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/validation_annotations.yml +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/validation_annotations.yml @@ -1,10 +1,6 @@ app.config: - router: - resource: %kernel.root_dir%/config/routing.xml validation: enabled: true - annotations: true - namespaces: - app: Application\Validator\Constraints\ - templating: - engine: php + annotations: + namespaces: + app: Application\Validator\Constraints\