Selaa lähdekoodia

[AsseticBundle] added coalescing directory resources that check the kernel for bundle templates

Kris Wallsmith 14 vuotta sitten
vanhempi
commit
e2f317c0bb

+ 66 - 29
src/Symfony/Bundle/AsseticBundle/DependencyInjection/AsseticExtension.php

@@ -81,6 +81,15 @@ class AsseticExtension extends Extension
         self::registerFormulaResources($container, $parameterBag->resolveValue($config['bundles']));
     }
 
+    /**
+     * Merges the user's config arrays.
+     *
+     * @param array   $configs An array of config arrays
+     * @param Boolean $debug   The debug mode
+     * @param array   $bundles An array of all bundle names
+     *
+     * @return array The merged config
+     */
     static protected function processConfigs(array $configs, $debug, array $bundles)
     {
         $configuration = new Configuration();
@@ -90,6 +99,14 @@ class AsseticExtension extends Extension
         return $processor->process($tree, $configs);
     }
 
+    /**
+     * Registers factory resources for certain bundles.
+     *
+     * @param ContainerBuilder $container The container
+     * @param array            $bundles   An array of select bundle names
+     *
+     * @throws InvalidArgumentException If registering resources from a bundle that doesn't exist
+     */
     static protected function registerFormulaResources(ContainerBuilder $container, array $bundles)
     {
         $map = $container->getParameter('kernel.bundles');
@@ -100,49 +117,69 @@ class AsseticExtension extends Extension
 
         $am = $container->getDefinition('assetic.asset_manager');
 
-        // bundle views/ directories
+        // bundle views/ directories and kernel overrides
         foreach ($bundles as $name) {
             $rc = new \ReflectionClass($map[$name]);
-            if (is_dir($dir = dirname($rc->getFileName()).'/Resources/views')) {
-                // FIXME: must also look for templates in %kernel.root_dir%/Resources/%bundle%/views
-                foreach (array('twig', 'php') as $engine) {
-                    $container->setDefinition(
-                        'assetic.'.$engine.'_directory_resource.'.$name,
-                        self::createDirectoryResourceDefinition($name, $dir, $engine)
-                    );
-                }
-            }
-        }
-
-        // kernel views/ directory
-        if (is_dir($dir = $container->getParameter('kernel.root_dir').'/Resources/views')) {
             foreach (array('twig', 'php') as $engine) {
                 $container->setDefinition(
-                    'assetic.'.$engine.'_directory_resource.kernel',
-                    self::createDirectoryResourceDefinition('', $dir, $engine)
+                    'assetic.'.$engine.'_directory_resource.'.$name,
+                    self::createDirectoryResourceDefinition($name, $engine, array(
+                        $container->getParameter('kernel.root_dir').'/Resources/'.$name.'/views',
+                        dirname($rc->getFileName()).'/Resources/views',
+                    ))
                 );
             }
         }
+
+        // kernel views/ directory
+        foreach (array('twig', 'php') as $engine) {
+            $container->setDefinition(
+                'assetic.'.$engine.'_directory_resource.kernel',
+                self::createDirectoryResourceDefinition('', $engine, array(
+                    $container->getParameter('kernel.root_dir').'/Resources/views',
+                ))
+            );
+        }
     }
 
     /**
-     * @todo decorate an abstract xml definition
+     * Creates a directory resource definition.
+     *
+     * If more than one directory is provided a coalescing definition will be
+     * returned.
+     *
+     * @param string $bundle A bundle name or empty string
+     * @param string $engine The templating engine
+     * @param array  $dirs   An array of directories to merge
+     *
+     * @return Definition A resource definition
      */
-    static protected function createDirectoryResourceDefinition($bundle, $dir, $engine)
+    static protected function createDirectoryResourceDefinition($bundle, $engine, array $dirs)
     {
-        $definition = new Definition('%assetic.directory_resource.class%');
+        $dirResources = array();
+        foreach ($dirs as $dir) {
+            $dirResources[] = $dirResource = new Definition('%assetic.directory_resource.class%');
+            $dirResource
+                ->addArgument(new Reference('templating.loader'))
+                ->addArgument($bundle)
+                ->addArgument($dir)
+                ->addArgument('/^[^.]+\.[^.]+\.'.$engine.'$/')
+                ->setPublic(false);
+        }
 
-        $definition
-            ->addArgument(new Reference('templating.loader'))
-            ->addArgument($bundle)
-            ->addArgument($dir)
-            ->addArgument('/^[^.]+\.[^.]+\.'.$engine.'$/')
-            ->addTag('assetic.templating.'.$engine)
-            ->addTag('assetic.formula_resource', array('loader' => $engine))
-            ->setPublic(false)
-        ;
+        if (1 == count($dirResources)) {
+            // no need to coalesce
+            $definition = $dirResources[0];
+        } else {
+            $definition = new Definition('%assetic.coalescing_directory_resource.class%');
+            $definition
+                ->addArgument($dirResources)
+                ->setPublic(false);
+        }
 
-        return $definition;
+        return $definition
+            ->addTag('assetic.templating.'.$engine)
+            ->addTag('assetic.formula_resource', array('loader' => $engine));
     }
 
     /**

+ 3 - 1
src/Symfony/Bundle/AsseticBundle/Factory/Resource/DirectoryResource.php

@@ -44,6 +44,8 @@ class DirectoryResource extends BaseDirectoryResource
 
     public function getIterator()
     {
-        return new DirectoryResourceIterator($this->loader, $this->bundle, $this->path, $this->getInnerIterator());
+        return is_dir($this->path)
+            ? new DirectoryResourceIterator($this->loader, $this->bundle, $this->path, $this->getInnerIterator())
+            : new \EmptyIterator();
     }
 }

+ 1 - 0
src/Symfony/Bundle/AsseticBundle/Resources/config/assetic.xml

@@ -10,6 +10,7 @@
         <parameter key="assetic.asset_manager_cache_warmer.class">Symfony\Bundle\AsseticBundle\CacheWarmer\AssetManagerCacheWarmer</parameter>
         <parameter key="assetic.cached_formula_loader.class">Assetic\Factory\Loader\CachedFormulaLoader</parameter>
         <parameter key="assetic.config_cache.class">Assetic\Cache\ConfigCache</parameter>
+        <parameter key="assetic.coalescing_directory_resource.class">Assetic\Factory\Resource\CoalescingDirectoryResource</parameter>
         <parameter key="assetic.directory_resource.class">Symfony\Bundle\AsseticBundle\Factory\Resource\DirectoryResource</parameter>
         <parameter key="assetic.filter_manager.class">Symfony\Bundle\AsseticBundle\FilterManager</parameter>