* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpKernel\DependencyInjection; use Composer\Autoload\ClassLoader; use Symfony\Component\Debug\DebugClassLoader; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\HttpKernel\Kernel; /** * Sets the classes to compile in the cache for the container. * * @author Fabien Potencier */ class AddAnnotatedClassesToCachePass implements CompilerPassInterface { private $kernel; public function __construct(Kernel $kernel) { $this->kernel = $kernel; } /** * {@inheritdoc} */ public function process(ContainerBuilder $container) { $classes = array(); $annotatedClasses = array(); foreach ($container->getExtensions() as $extension) { if ($extension instanceof Extension) { if (\PHP_VERSION_ID < 70000) { $classes = array_merge($classes, $extension->getClassesToCompile()); } $annotatedClasses = array_merge($annotatedClasses, $extension->getAnnotatedClassesToCompile()); } } $existingClasses = $this->getClassesInComposerClassMaps(); if (\PHP_VERSION_ID < 70000) { $classes = $container->getParameterBag()->resolveValue($classes); $this->kernel->setClassCache($this->expandClasses($classes, $existingClasses)); } $annotatedClasses = $container->getParameterBag()->resolveValue($annotatedClasses); $this->kernel->setAnnotatedClassCache($this->expandClasses($annotatedClasses, $existingClasses)); } /** * Expands the given class patterns using a list of existing classes. * * @param array $patterns The class patterns to expand * @param array $classes The existing classes to match against the patterns * * @return array A list of classes derivated from the patterns */ private function expandClasses(array $patterns, array $classes) { $expanded = array(); // Explicit classes declared in the patterns are returned directly foreach ($patterns as $key => $pattern) { if ('\\' !== substr($pattern, -1) && false === strpos($pattern, '*')) { unset($patterns[$key]); $expanded[] = ltrim($pattern, '\\'); } } // Match patterns with the classes list $regexps = $this->patternsToRegexps($patterns); foreach ($classes as $class) { $class = ltrim($class, '\\'); if ($this->matchAnyRegexps($class, $regexps)) { $expanded[] = $class; } } return array_unique($expanded); } private function getClassesInComposerClassMaps() { $classes = array(); foreach (spl_autoload_functions() as $function) { if (!is_array($function)) { continue; } if ($function[0] instanceof DebugClassLoader) { $function = $function[0]->getClassLoader(); } if (is_array($function) && $function[0] instanceof ClassLoader) { $classes += array_filter($function[0]->getClassMap()); } } return array_keys($classes); } private function patternsToRegexps($patterns) { $regexps = array(); foreach ($patterns as $pattern) { // Escape user input $regex = preg_quote(ltrim($pattern, '\\')); // Wildcards * and ** $regex = strtr($regex, array('\\*\\*' => '.*?', '\\*' => '[^\\\\]*?')); // If this class does not end by a slash, anchor the end if ('\\' !== substr($regex, -1)) { $regex .= '$'; } $regexps[] = '{^\\\\'.$regex.'}'; } return $regexps; } private function matchAnyRegexps($class, $regexps) { $blacklisted = false !== strpos($class, 'Test'); foreach ($regexps as $regex) { if ($blacklisted && false === strpos($regex, 'Test')) { continue; } if (preg_match($regex, '\\'.$class)) { return true; } } return false; } } __halt_compiler();----SIGNATURE:----Bge1B/4ZJ42eMJE5K7SbJ+W1v9fent+rppmwBna/ITUH4UfhBQN2Yh+9wc9gN6ocsZ8oQG6YzEnN6jSJ/cYKLx0oQpQqVhZ5bN1s6KMy/3Ms/LTYq4vwn79kHHk7ctERLZZs73kiZ5dS+G1hgh3MsV/6OvBms4xfyefbdxrSZG1j7np0Q42VUDzm2/YZ3pEXV+eVuoCSY+bvJRvJFYZFZD++VVWOii5f2jAAMnMblKzKQBUFwM1BinjdDZ9oj8Co5D0dn1JolBncWfDgIedKNVWGX7neGmgaoIy0csap0kpYmmloHsfFLd/1T7aCiZpft9lmaVbsowBKk3QYwO/6LTFGfHNrXDVqCowlbt5chuAktJzZ3w3YOXfa/1kJ9DV9nV/vxexeOuR68G0mbiuoa5BrLJSuvOHZNplISm3tpMz1hlyg8/KK7z1b/7KOTWHTKe4qPAMDHb088wJDA5Pw31IRUPHlr4WiUR/RbIfrMsb8BS1Z9U8nrdLis/i098fKrDfvXpKHtSyNmP5hk6S2QXAZTPE/WGD1kpOiYRR55PBniS9hPq37ZRjQjR+oElHrenOtY2ofTYUN/OoMqsA6NaWa8CdJTIOyeVUCXvFu5Xl53IRwgN+0XTkZz2LWQxcpNtBmYUJkX3Igm0moSUcyFdoTrf6+dcYCpHJrwaBJQYQ=----ATTACHMENT:----Mzc5NDY4MDI1OTU0MjcyNSA2NzgzNDE5Mjg1NDAxMDMyIDc5MTk5NDk3MTEzMjg2OA==