Просмотр исходного кода

made ClassCollectionLoader smarter

Fabien Potencier 15 лет назад
Родитель
Сommit
e03642dfa6

+ 41 - 13
src/Symfony/Bundle/FrameworkBundle/DependencyInjection/WebExtension.php

@@ -58,6 +58,20 @@ class WebExtension extends Extension
             }
 
             $container->setParameter('routing.resource', $config['router']['resource']);
+
+            $this->addCompiledClasses($container, array(
+                'Symfony\\Components\\Routing\\RouterInterface',
+                'Symfony\\Components\\Routing\\Router',
+                'Symfony\\Components\\Routing\\Matcher\\UrlMatcherInterface',
+                'Symfony\\Components\\Routing\\Matcher\\UrlMatcher',
+                'Symfony\\Components\\Routing\\Generator\\UrlGeneratorInterface',
+                'Symfony\\Components\\Routing\\Generator\\UrlGenerator',
+                'Symfony\\Components\\Routing\\Loader\\Loader',
+                'Symfony\\Components\\Routing\\Loader\\DelegatingLoader',
+                'Symfony\\Components\\Routing\\Loader\\LoaderResolver',
+                'Symfony\\Bundle\\FrameworkBundle\\Routing\\LoaderResolver',
+                'Symfony\\Bundle\\FrameworkBundle\\Routing\\DelegatingLoader',
+            ));
         }
 
         if (isset($config['toolbar']) && $config['toolbar']) {
@@ -164,20 +178,24 @@ class WebExtension extends Extension
             }
         }
 
-        $container->setParameter('kernel.compiled_classes', array_merge($container->getParameter('kernel.compiled_classes'), array(
-            'Symfony\\Components\\EventDispatcher\\Event',
+        $this->addCompiledClasses($container, array(
+            'Symfony\\Components\\HttpFoundation\\ParameterBag',
+            'Symfony\\Components\\HttpFoundation\\HeaderBag',
+            'Symfony\\Components\\HttpFoundation\\Request',
+            'Symfony\\Components\\HttpFoundation\\Response',
+
+            'Symfony\\Components\\HttpKernel\\HttpKernel',
             'Symfony\\Components\\HttpKernel\\ResponseListener',
-            'Symfony\\Bundle\\FrameworkBundle\\Controller',
+            'Symfony\\Components\\HttpKernel\\Controller\\ControllerResolver',
 
-            // routing
-            'Symfony\\Components\\Routing\\RouterInterface',
-            'Symfony\\Components\\Routing\\Router',
-            'Symfony\\Components\\Routing\\Matcher\\UrlMatcherInterface',
-            'Symfony\\Components\\Routing\\Matcher\\UrlMatcher',
-            'Symfony\\Components\\Routing\\Generator\\UrlGeneratorInterface',
-            'Symfony\\Components\\Routing\\Generator\\UrlGenerator',
             'Symfony\\Bundle\\FrameworkBundle\\RequestListener',
-        )));
+            'Symfony\\Bundle\\FrameworkBundle\\Controller\\ControllerNameConverter',
+            'Symfony\\Bundle\\FrameworkBundle\\Controller\\ControllerResolver',
+
+            'Symfony\\Components\\EventDispatcher\\Event',
+
+            'Symfony\\Bundle\\FrameworkBundle\\Controller',
+        ));
     }
 
     /**
@@ -243,7 +261,7 @@ class WebExtension extends Extension
         }
 
         // compilation
-        $container->setParameter('kernel.compiled_classes', array_merge($container->getParameter('kernel.compiled_classes'), array(
+        $this->addCompiledClasses($container, array(
             'Symfony\\Components\\Templating\\Loader\\LoaderInterface',
             'Symfony\\Components\\Templating\\Loader\\Loader',
             'Symfony\\Components\\Templating\\Loader\\FilesystemLoader',
@@ -254,7 +272,17 @@ class WebExtension extends Extension
             'Symfony\\Components\\Templating\\Storage\\Storage',
             'Symfony\\Components\\Templating\\Storage\\FileStorage',
             'Symfony\\Bundle\\FrameworkBundle\\Templating\\Engine',
-        )));
+            'Symfony\\Components\\Templating\\Helper\\Helper',
+            'Symfony\\Components\\Templating\\Helper\\SlotsHelper',
+            'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\ActionsHelper',
+            'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\RouterHelper',
+            'Symfony\\Bundle\\FrameworkBundle\\Templating\\Helper\\RouterHelper',
+        ));
+    }
+
+    protected function addCompiledClasses($container, array $classes)
+    {
+        $container->setParameter('kernel.compiled_classes', array_merge($container->getParameter('kernel.compiled_classes'), $classes));
     }
 
     /**

+ 19 - 3
src/Symfony/Framework/ClassCollectionLoader.php

@@ -21,19 +21,35 @@ class ClassCollectionLoader
     static protected $loaded;
 
     /**
+     * Loads a list of classes and caches them in one big file.
+     *
+     * @param array   $classes    An array of classes to load
+     * @param string  $cacheDir   A cache directory
+     * @param string  $name       The cache name prefix
+     * @param Boolean $autoReload Whether to flush the cache when the cache is stale or not
+     * @param Boolean $adaptive   Whether to remove already declared classes or not
+     *
      * @throws \InvalidArgumentException When class can't be loaded
      */
-    static public function load($classes, $cacheDir, $name, $autoReload)
+    static public function load($classes, $cacheDir, $name, $autoReload, $adaptive = false)
     {
         // each $name can only be loaded once per PHP process
         if (isset(self::$loaded[$name])) {
             return;
         }
 
-        self::$loaded[$name] = true;
-
         $classes = array_unique($classes);
 
+        if ($adaptive) {
+            // don't include already declared classes
+            $classes = array_diff($classes, get_declared_classes());
+
+            // the cache is different depending on which classes are already declared
+            $name = $name.'-'.substr(md5(implode('|', $classes)), 0, 5);
+        }
+
+        self::$loaded[$name] = true;
+
         $cache = $cacheDir.'/'.$name.'.php';
 
         // auto-reload

+ 2 - 1
src/Symfony/Framework/Kernel.php

@@ -129,7 +129,8 @@ abstract class Kernel implements HttpKernelInterface, \Serializable
             $this->container->getParameter('kernel.compiled_classes'),
             $this->container->getParameter('kernel.cache_dir'),
             'classes',
-            $this->container->getParameter('kernel.debug')
+            $this->container->getParameter('kernel.debug'),
+            true
         );
 
         foreach ($this->bundles as $bundle) {

+ 5 - 2
src/Symfony/Framework/bootstrap.php

@@ -138,11 +138,14 @@ class ErrorHandler {
 namespace Symfony\Framework;
 class ClassCollectionLoader {
     static protected $loaded;
-    static public function load($classes, $cacheDir, $name, $autoReload) {
+    static public function load($classes, $cacheDir, $name, $autoReload, $strict = false) {
                 if (isset(self::$loaded[$name])) {
             return; }
-        self::$loaded[$name] = true;
         $classes = array_unique($classes);
+        if ($strict) {
+                        $classes = array_diff($classes, get_declared_classes());
+                        $name = $name.'-'.substr(md5(implode('|', $classes)), 0, 5); }
+        self::$loaded[$name] = true;
         $cache = $cacheDir.'/'.$name.'.php';
                 $reload = false;
         if ($autoReload) {