made ClassCollectionLoader smarter

This commit is contained in:
Fabien Potencier 2010-08-18 13:43:32 +02:00
parent 68af528813
commit e03642dfa6
4 changed files with 68 additions and 20 deletions

View File

@ -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));
}
/**

View File

@ -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

View File

@ -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) {

View File

@ -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) {