From e03642dfa6370f8f52429a7873bb1d88b6ecea20 Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Wed, 18 Aug 2010 13:43:32 +0200 Subject: [PATCH] made ClassCollectionLoader smarter --- .../DependencyInjection/WebExtension.php | 56 ++++++++++++++----- .../Framework/ClassCollectionLoader.php | 22 +++++++- src/Symfony/Framework/Kernel.php | 3 +- src/Symfony/Framework/bootstrap.php | 7 ++- 4 files changed, 68 insertions(+), 20 deletions(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/WebExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/WebExtension.php index 5a6237f98f..bbd11ece46 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/WebExtension.php +++ b/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', - 'Symfony\\Components\\HttpKernel\\ResponseListener', - 'Symfony\\Bundle\\FrameworkBundle\\Controller', + $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\\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)); } /** diff --git a/src/Symfony/Framework/ClassCollectionLoader.php b/src/Symfony/Framework/ClassCollectionLoader.php index 5bee6a6b9b..5be6a07745 100644 --- a/src/Symfony/Framework/ClassCollectionLoader.php +++ b/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 diff --git a/src/Symfony/Framework/Kernel.php b/src/Symfony/Framework/Kernel.php index 40a50385cb..57184473a3 100644 --- a/src/Symfony/Framework/Kernel.php +++ b/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) { diff --git a/src/Symfony/Framework/bootstrap.php b/src/Symfony/Framework/bootstrap.php index b275a9a7c9..e912027fe8 100644 --- a/src/Symfony/Framework/bootstrap.php +++ b/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) {