Kaynağa Gözat

reverted changes to the adaptive cache loader cache

Fabien Potencier 14 yıl önce
ebeveyn
işleme
e081e5919e

+ 8 - 10
src/Symfony/Component/ClassLoader/ClassCollectionLoader.php

@@ -42,16 +42,19 @@ class ClassCollectionLoader
 
         $classes = array_unique($classes);
 
+        if ($adaptive) {
+            // don't include already declared classes
+            $classes = array_diff($classes, get_declared_classes(), get_declared_interfaces());
+
+            // the cache is different depending on which classes are already declared
+            $name = $name.'-'.substr(md5(implode('|', $classes)), 0, 5);
+        }
+
         $cache = $cacheDir.'/'.$name.'.php';
 
         // auto-reload
         $reload = false;
         if ($autoReload) {
-            if ($adaptive) {
-                // don't include already declared classes
-                $classes = array_diff($classes, get_declared_classes(), get_declared_interfaces());
-            }
-
             $metadata = $cacheDir.'/'.$name.'.meta';
             if (!file_exists($metadata) || !file_exists($cache)) {
                 $reload = true;
@@ -79,11 +82,6 @@ class ClassCollectionLoader
             return;
         }
 
-        if ($adaptive) {
-            // don't include already declared classes
-            $classes = array_diff($classes, get_declared_classes(), get_declared_interfaces());
-        }
-
         $files = array();
         $content = '';
         foreach ($classes as $class) {

+ 29 - 23
src/Symfony/Component/HttpKernel/bootstrap.php

@@ -719,30 +719,38 @@ abstract class Kernel implements KernelInterface
     protected function initializeBundles()
     {
                 $this->bundles = array();
-        $this->bundleMap = array();
+        $topMostBundles = array();
+        $directChildren = array();
         foreach ($this->registerBundles() as $bundle) {
             $name = $bundle->getName();
             if (isset($this->bundles[$name])) {
                 throw new \LogicException(sprintf('Trying to register two bundles with the same name "%s"', $name));
             }
             $this->bundles[$name] = $bundle;
-            $this->bundleMap[$name] = array($bundle);
-        }
-                $extended = array();
-        foreach ($this->bundles as $name => $bundle) {
-            $parent = $bundle;
-            $first = true;
-            while ($parentName = $parent->getParent()) {
-                if (!isset($this->bundles[$parentName])) {
-                    throw new \LogicException(sprintf('Bundle "%s" extends bundle "%s", which is not registered.', $name, $parentName));
+            if ($parentName = $bundle->getParent()) {
+                if (isset($directChildren[$parentName])) {
+                    throw new \LogicException(sprintf('Bundle "%s" is directly extended by two bundles "%s" and "%s".', $parentName, $name, $directChildren[$parentName]));
                 }
-                if ($first && isset($extended[$parentName])) {
-                    throw new \LogicException(sprintf('Bundle "%s" is directly extended by two bundles "%s" and "%s".', $parentName, $name, $extended[$parentName]));
-                }
-                $first = false;
-                $parent = $this->bundles[$parentName];
-                $extended[$parentName] = $name;
-                array_unshift($this->bundleMap[$parentName], $bundle);
+                $directChildren[$parentName] = $name;
+            } else {
+                $topMostBundles[$name] = $bundle;
+            }
+        }
+                if (count($diff = array_diff(array_keys($directChildren), array_keys($this->bundles)))) {
+            throw new \LogicException(sprintf('Bundle "%s" extends bundle "%s", which is not registered.', $directChildren[$diff[0]], $diff[0]));
+        }
+                $this->bundleMap = array();
+        foreach ($topMostBundles as $name => $bundle) {
+            $bundleMap = array($bundle);
+            $hierarchy = array($name);
+            while (isset($directChildren[$name])) {
+                $name = $directChildren[$name];
+                array_unshift($bundleMap, $this->bundles[$name]);
+                $hierarchy[] = $name;
+            }
+            foreach ($hierarchy as $bundle) {
+                $this->bundleMap[$bundle] = $bundleMap;
+                array_pop($bundleMap);
             }
         }
     }
@@ -1756,12 +1764,13 @@ class ClassCollectionLoader
         }
         self::$loaded[$name] = true;
         $classes = array_unique($classes);
+        if ($adaptive) {
+                        $classes = array_diff($classes, get_declared_classes(), get_declared_interfaces());
+                        $name = $name.'-'.substr(md5(implode('|', $classes)), 0, 5);
+        }
         $cache = $cacheDir.'/'.$name.'.php';
                 $reload = false;
         if ($autoReload) {
-            if ($adaptive) {
-                                $classes = array_diff($classes, get_declared_classes(), get_declared_interfaces());
-            }
             $metadata = $cacheDir.'/'.$name.'.meta';
             if (!file_exists($metadata) || !file_exists($cache)) {
                 $reload = true;
@@ -1784,9 +1793,6 @@ class ClassCollectionLoader
             require_once $cache;
             return;
         }
-        if ($adaptive) {
-                        $classes = array_diff($classes, get_declared_classes(), get_declared_interfaces());
-        }
         $files = array();
         $content = '';
         foreach ($classes as $class) {