Skip to content

Commit

Permalink
made ClassCollectionLoader smarter
Browse files Browse the repository at this point in the history
  • Loading branch information
fabpot committed Aug 19, 2010
1 parent 68af528 commit e03642d
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 19 deletions.
Expand Up @@ -58,6 +58,20 @@ public function configLoad($config, ContainerBuilder $container)
}

$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']) {
Expand Down Expand Up @@ -164,20 +178,24 @@ public function configLoad($config, ContainerBuilder $container)
}
}

$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',
));
}

/**
Expand Down Expand Up @@ -243,7 +261,7 @@ public function templatingLoad($config, ContainerBuilder $container)
}

// 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',
Expand All @@ -254,7 +272,17 @@ public function templatingLoad($config, ContainerBuilder $container)
'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));
}

/**
Expand Down
22 changes: 19 additions & 3 deletions src/Symfony/Framework/ClassCollectionLoader.php
Expand Up @@ -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
Expand Down
3 changes: 2 additions & 1 deletion src/Symfony/Framework/Kernel.php
Expand Up @@ -129,7 +129,8 @@ public function boot()
$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) {
Expand Down
7 changes: 5 additions & 2 deletions src/Symfony/Framework/bootstrap.php
Expand Up @@ -138,11 +138,14 @@ public function handle($level, $message, $file, $line, $context) {
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) {
Expand Down

0 comments on commit e03642d

Please sign in to comment.