8000 [HttpKernel] Reduce code complexity by merging "ClassMatcher" into "A… · symfony/symfony@3ecb1f7 · GitHub
[go: up one dir, main page]

Skip to content
Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 3ecb1f7

Browse files
nicolas-grekastgalopin
authored andcommitted
[HttpKernel] Reduce code complexity by merging "ClassMatcher" into "AddClassesToCachePass"
1 parent 3504470 commit 3ecb1f7

File tree

12 files changed

+215
-334
lines changed

12 files changed

+215
-334
lines changed

src/Symfony/Bundle/FrameworkBundle/CacheWarmer/ClassCacheCacheWarmer.php

Lines changed: 1 addition & 16 deletions
Original file li 10000 ne numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313

1414
use Symfony\Component\ClassLoader\ClassCollectionLoader;
1515
use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerInterface;
16-
use Symfony\Component\HttpKernel\CacheWarmer\ClassMatcherInterface;
1716

1817
/**
1918
* Generates the Class Cache (classes.php) file.
@@ -22,13 +21,6 @@
2221
*/
2322
class ClassCacheCacheWarmer implements CacheWarmerInterface
2423
{
25-
private $classMatcher;
26-
27-
public function __construct(ClassMatcherInterface $classMatcher = null)
28-
{
29-
$this->classMatcher = $classMatcher;
30-
}
31-
3224
/**
3325
* Warms up the cache.
3426
*
@@ -46,14 +38,7 @@ public function warmUp($cacheDir)
4638
return;
4739
}
4840

49-
$classesToCompile = include $classmap;
50-
51-
if ($this->classMatcher) {
52-
$declaredClasses = array_keys(ClassCollectionLoader::getComposerClassMap());
53-
$classesToCompile = $this->classMatcher->match($declaredClasses, $classesToCompile);
54-
}
55-
56-
ClassCollectionLoader::load($classesToCompile, $cacheDir, 'classes', false);
41+
ClassCollectionLoader::load(include($classmap), $cacheDir, 'classes', false);
5742
}
5843

5944
/**

src/Symfony/Bundle/FrameworkBundle/Resources/config/services.xml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,11 @@
1818

1919
<service id="requ 97AE est_stack" class="Symfony\Component\HttpFoundation\RequestStack" />
2020

21-
<service id="kernel.class_cache.matcher" class="Symfony\Component\HttpKernel\CacheWarmer\ClassMatcher" public="false" />
22-
2321
<service id="cache_warmer" class="Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerAggregate">
2422
<argument type="collection" />
2523
</service>
2624

2725
<service id="kernel.class_cache.cache_warmer" class="Symfony\Bundle\FrameworkBundle\CacheWarmer\ClassCacheCacheWarmer">
28-
<argument type="service" id="kernel.class_cache.matcher" />
2926
<tag name="kernel.cache_warmer" />
3027
</service>
3128

src/Symfony/Bundle/FrameworkBundle/composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
"php": ">=5.5.9",
2020
"symfony/asset": "~2.8|~3.0",
2121
"symfony/cache": "~3.1",
22-
"symfony/class-loader": "~3.2",
22+
"symfony/class-loader": "~2.8|~3.0",
2323
"symfony/dependency-injection": "~3.2",
2424
"symfony/config": "~2.8|~3.0",
2525
"symfony/event-dispatcher": "~2.8|~3.0",

src/Symfony/Component/ClassLoader/ClassCollectionLoader.php

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,6 @@
1111

1212
namespace Symfony\Component\ClassLoader;
1313

14-
use Composer\Autoload\ClassLoader;
15-
use Symfony\Component\Debug\DebugClassLoader;
16-
1714
/**
1815
* ClassCollectionLoader.
1916
*
@@ -25,32 +22,6 @@ class ClassCollectionLoader
2522
private static $seen;
2623
private static $useTokenizer = true;
2724

28-
/**
29-
* Return the Composer class map.
30-
*
31-
* @return array
32-
*/
33-
public static function getComposerClassMap()
34-
{
35-
$classes = array();
36-
37-
foreach (spl_autoload_functions() as $function) {
38-
if (!is_array($function)) {
39-
continue;
40-
}
41-
42-
if ($function[0] instanceof DebugClassLoader) {
43-
$function = $function[0]->getClassLoader();
44-
}
45-
46-
if (is_array($function) && $function[0] instanceof ClassLoader) {
47-
$classes += $function[0]->getClassMap();
48-
}
49-
}
50-
51-
return $classes;
52-
}
53-
5425
/**
5526
* Loads a list of classes and caches them in one big file.
5627
*

src/Symfony/Component/HttpKernel/CacheWarmer/ClassMatcher.php

Lines changed: 0 additions & 91 deletions
This file was deleted.

src/Symfony/Component/HttpKernel/CacheWarmer/ClassMatcherInterface.php

Lines changed: 0 additions & 30 deletions
This file was deleted.

src/Symfony/Component/HttpKernel/DependencyInjection/AddAnnotatedClassesToCachePass.php

Lines changed: 0 additions & 46 deletions
This file was deleted.

src/Symfony/Component/HttpKernel/DependencyInjection/AddClassesToCachePass.php

Lines changed: 103 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
namespace Symfony\Component\HttpKernel\DependencyInjection;
1313

14+
use Composer\Autoload\ClassLoader;
15+
use Symfony\Component\Debug\DebugClassLoader;
1416
use Symfony\Component\DependencyInjection\ContainerBuilder;
1517
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
1618
use Symfony\Component\HttpKernel\Kernel;
@@ -35,12 +37,112 @@ public function __construct(Kernel $kernel)
3537
public function process(ContainerBuilder $container)
3638
{
3739
$classes = array();
40+
$annotatedClasses = array();
3841
foreach ($container->getExtensions() as $extension) {
3942
if ($extension instanceof Extension) {
4043
$classes = array_merge($classes, $extension->getClassesToCompile());
44+
$annotatedClasses = array_merge($annotatedClasses, $extension->getAnnotatedClassesToCompile());
4145
}
4246
}
4347

44-
$this->kernel->setClassCache(array_unique($container->getParameterBag()->resolveValue($classes)));
48+
$classes = $container->getParameterBag()->resolveValue($classes);
49+
$annotatedClasses = $container->getParameterBag()->resolveValue($annotatedClasses);
50+
$existingClasses = $this->getClassesInComposerClassMaps();
51+
52+
$this->kernel->setClassCache($this->expandClasses($classes, $existingClasses), $this->expandClasses($annotatedClasses, $existingClasses));
53+
}
54+
55+
/**
56+
* Expands the given class patterns using a list of existing classes.
57+
*
58+
* @param array $patterns The class patterns to expand
59+
* @param array $classes The existing classes to match against the patterns
60+
*
61+
* @return array A list of classes derivated from the patterns
62+
*/
63+
private function expandClasses(array $patterns, array $classes)
64+
{
65+
$expanded = array();
66+
67+
// Explicit classes declared in the patterns are returned directly
68+
foreach ($patterns as $key => $pattern) {
69+
if (substr($pattern, -1) !== '\\' && false === strpos($pattern, '*')) {
70+
unset($patterns[$key]);
71+
$expanded[] = ltrim($pattern, '\\');
72+
}
73+
}
74+
75+
// Match patterns with the classes list
76+
$regexps = $this->patternsToRegexps($patterns);
77+
78+
foreach ($classes as $class) {
79+
$class = ltrim($class, '\\');
80+
81+
if ($this->matchAnyRegexps($class, $regexps)) {
82+
$expanded[] = $class;
83+
}
84+
}
85+
86+
return array_unique($expanded);
87+
}
88+
89+
private function getClassesInComposerClassMaps()
90+
{
91+
$classes = array();
92+
93+
foreach (spl_autoload_functions() as $function) {
94+
if (!is_array($function)) {
95+
continue;
96+
}
97+
98+
if ($function[0] instanceof DebugClassLoader) {
99+
$function = $function[0]->getClassLoader();
100+
}
101+
102+
if (is_array($function) && $function[0] instanceof ClassLoader) {
103+
$classes += $function[0]->getClassMap();
104+
}
105+
}
106+
107+
return array_keys($classes);
108+
}
109+
110+
private function patternsToRegexps($patterns)
111+
{
112+
$regexps = array();
113+
114+
foreach ($patterns as $pattern) {
115+
// Escape user input
116+
$regex = preg_quote(ltrim($pattern, '\\'));
117+
118+
// Wildcards * and **
119+
$regex = strtr($regex, array('\\*\\*' => '.*?', '\\*' => '[^\\\\]*?'));
120+
121+
// If this class does not end by a slash, anchor the end
122+
if (substr($regex, -1) !== '\\') {
123+
$regex .= '$';
124+
}
125+
126+
$regexps[] = '{^\\\\'.$regex.'}';
127+
}
128+
129+
return $regexps;
130+
}
131+
132+
private function matchAnyRegexps($class, $regexps)
133+
{
134+
$blacklisted = false !== strpos($class, 'Test');
135+
136+
foreach ($regexps as $regex) {
137+
if ($blacklisted && false === strpos($regex, 'Test')) {
138+
continue;
139+
}
140+
141+
if (preg_match($regex, '\\'.$class)) {
142+
return true;
143+
}
144+
}
145+
146+
return false;
45147
}
46148
}

0 commit comments

Comments
 (0)
0