|
@@ -427,120 +427,6 @@ class ErrorHandler
|
|
|
}
|
|
|
namespace Symfony\Component\HttpKernel
|
|
|
{
|
|
|
-class ClassCollectionLoader
|
|
|
-{
|
|
|
- static protected $loaded;
|
|
|
- static public function load($classes, $cacheDir, $name, $autoReload, $adaptive = false)
|
|
|
- {
|
|
|
- if (isset(self::$loaded[$name])) {
|
|
|
- return;
|
|
|
- }
|
|
|
- self::$loaded[$name] = true;
|
|
|
- $classes = array_unique($classes);
|
|
|
- $cache = $cacheDir.'/'.$name.'.php';
|
|
|
- $reload = false;
|
|
|
- if ($autoReload) {
|
|
|
- if ($adaptive) {
|
|
|
- $classes = array_diff($classes, get_declared_classes(), get_declared_interfaces());
|
|
|
- }
|
|
|
- $metadata = $cacheDir.'/'.$name.'.meta';
|
|
|
- if (!file_exists($metadata) || !file_exists($cache)) {
|
|
|
- $reload = true;
|
|
|
- } else {
|
|
|
- $time = filemtime($cache);
|
|
|
- $meta = unserialize(file_get_contents($metadata));
|
|
|
- if ($meta[1] != $classes) {
|
|
|
- $reload = true;
|
|
|
- } else {
|
|
|
- foreach ($meta[0] as $resource) {
|
|
|
- if (!file_exists($resource) || filemtime($resource) > $time) {
|
|
|
- $reload = true;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- if (!$reload && file_exists($cache)) {
|
|
|
- require_once $cache;
|
|
|
- return;
|
|
|
- }
|
|
|
- if ($adaptive) {
|
|
|
- $classes = array_diff($classes, get_declared_classes(), get_declared_interfaces());
|
|
|
- }
|
|
|
- $files = array();
|
|
|
- $content = '';
|
|
|
- foreach ($classes as $class) {
|
|
|
- if (!class_exists($class) && !interface_exists($class)) {
|
|
|
- throw new \InvalidArgumentException(sprintf('Unable to load class "%s"', $class));
|
|
|
- }
|
|
|
- $r = new \ReflectionClass($class);
|
|
|
- $files[] = $r->getFileName();
|
|
|
- $c = preg_replace(array('/^\s*<\?php/', '/\?>\s*$/'), '', file_get_contents($r->getFileName()));
|
|
|
- if (!$r->inNamespace()) {
|
|
|
- $c = "\nnamespace\n{\n$c\n}\n";
|
|
|
- } else {
|
|
|
- $c = self::fixNamespaceDeclarations('<?php '.$c);
|
|
|
- $c = preg_replace('/^\s*<\?php/', '', $c);
|
|
|
- }
|
|
|
- $content .= $c;
|
|
|
- }
|
|
|
- if (!is_dir(dirname($cache))) {
|
|
|
- mkdir(dirname($cache), 0777, true);
|
|
|
- }
|
|
|
- self::writeCacheFile($cache, Kernel::stripComments('<?php '.$content));
|
|
|
- if ($autoReload) {
|
|
|
- self::writeCacheFile($metadata, serialize(array($files, $classes)));
|
|
|
- }
|
|
|
- }
|
|
|
- static public function fixNamespaceDeclarations($source)
|
|
|
- {
|
|
|
- if (!function_exists('token_get_all')) {
|
|
|
- return $source;
|
|
|
- }
|
|
|
- $output = '';
|
|
|
- $inNamespace = false;
|
|
|
- $tokens = token_get_all($source);
|
|
|
- while ($token = array_shift($tokens)) {
|
|
|
- if (is_string($token)) {
|
|
|
- $output .= $token;
|
|
|
- } elseif (T_NAMESPACE === $token[0]) {
|
|
|
- if ($inNamespace) {
|
|
|
- $output .= "}\n";
|
|
|
- }
|
|
|
- $output .= $token[1];
|
|
|
- while (($t = array_shift($tokens)) && is_array($t) && in_array($t[0], array(T_WHITESPACE, T_NS_SEPARATOR, T_STRING))) {
|
|
|
- $output .= $t[1];
|
|
|
- }
|
|
|
- if (is_string($t) && '{' === $t) {
|
|
|
- $inNamespace = false;
|
|
|
- array_unshift($tokens, $t);
|
|
|
- } else {
|
|
|
- $output .= "\n{";
|
|
|
- $inNamespace = true;
|
|
|
- }
|
|
|
- } else {
|
|
|
- $output .= $token[1];
|
|
|
- }
|
|
|
- }
|
|
|
- if ($inNamespace) {
|
|
|
- $output .= "}\n";
|
|
|
- }
|
|
|
- return $output;
|
|
|
- }
|
|
|
- static protected function writeCacheFile($file, $content)
|
|
|
- {
|
|
|
- $tmpFile = tempnam(dirname($file), basename($file));
|
|
|
- if (false !== @file_put_contents($tmpFile, $content) && @rename($tmpFile, $file)) {
|
|
|
- chmod($file, 0644);
|
|
|
- return;
|
|
|
- }
|
|
|
- throw new \RuntimeException(sprintf('Failed to write cache file "%s".', $file));
|
|
|
- }
|
|
|
-}
|
|
|
-}
|
|
|
-namespace Symfony\Component\HttpKernel
|
|
|
-{
|
|
|
use Symfony\Component\HttpFoundation\Request;
|
|
|
interface HttpKernelInterface
|
|
|
{
|
|
@@ -1839,6 +1725,136 @@ class Request
|
|
|
}
|
|
|
namespace Symfony\Component\ClassLoader
|
|
|
{
|
|
|
+class ClassCollectionLoader
|
|
|
+{
|
|
|
+ static protected $loaded;
|
|
|
+ static public function load($classes, $cacheDir, $name, $autoReload, $adaptive = false)
|
|
|
+ {
|
|
|
+ if (isset(self::$loaded[$name])) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ self::$loaded[$name] = true;
|
|
|
+ $classes = array_unique($classes);
|
|
|
+ $cache = $cacheDir.'/'.$name.'.php';
|
|
|
+ $reload = false;
|
|
|
+ if ($autoReload) {
|
|
|
+ if ($adaptive) {
|
|
|
+ $classes = array_diff($classes, get_declared_classes(), get_declared_interfaces());
|
|
|
+ }
|
|
|
+ $metadata = $cacheDir.'/'.$name.'.meta';
|
|
|
+ if (!file_exists($metadata) || !file_exists($cache)) {
|
|
|
+ $reload = true;
|
|
|
+ } else {
|
|
|
+ $time = filemtime($cache);
|
|
|
+ $meta = unserialize(file_get_contents($metadata));
|
|
|
+ if ($meta[1] != $classes) {
|
|
|
+ $reload = true;
|
|
|
+ } else {
|
|
|
+ foreach ($meta[0] as $resource) {
|
|
|
+ if (!file_exists($resource) || filemtime($resource) > $time) {
|
|
|
+ $reload = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!$reload && file_exists($cache)) {
|
|
|
+ require_once $cache;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if ($adaptive) {
|
|
|
+ $classes = array_diff($classes, get_declared_classes(), get_declared_interfaces());
|
|
|
+ }
|
|
|
+ $files = array();
|
|
|
+ $content = '';
|
|
|
+ foreach ($classes as $class) {
|
|
|
+ if (!class_exists($class) && !interface_exists($class)) {
|
|
|
+ throw new \InvalidArgumentException(sprintf('Unable to load class "%s"', $class));
|
|
|
+ }
|
|
|
+ $r = new \ReflectionClass($class);
|
|
|
+ $files[] = $r->getFileName();
|
|
|
+ $c = preg_replace(array('/^\s*<\?php/', '/\?>\s*$/'), '', file_get_contents($r->getFileName()));
|
|
|
+ if (!$r->inNamespace()) {
|
|
|
+ $c = "\nnamespace\n{\n$c\n}\n";
|
|
|
+ } else {
|
|
|
+ $c = self::fixNamespaceDeclarations('<?php '.$c);
|
|
|
+ $c = preg_replace('/^\s*<\?php/', '', $c);
|
|
|
+ }
|
|
|
+ $content .= $c;
|
|
|
+ }
|
|
|
+ if (!is_dir(dirname($cache))) {
|
|
|
+ mkdir(dirname($cache), 0777, true);
|
|
|
+ }
|
|
|
+ self::writeCacheFile($cache, self::stripComments('<?php '.$content));
|
|
|
+ if ($autoReload) {
|
|
|
+ self::writeCacheFile($metadata, serialize(array($files, $classes)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ static public function fixNamespaceDeclarations($source)
|
|
|
+ {
|
|
|
+ if (!function_exists('token_get_all')) {
|
|
|
+ return $source;
|
|
|
+ }
|
|
|
+ $output = '';
|
|
|
+ $inNamespace = false;
|
|
|
+ $tokens = token_get_all($source);
|
|
|
+ while ($token = array_shift($tokens)) {
|
|
|
+ if (is_string($token)) {
|
|
|
+ $output .= $token;
|
|
|
+ } elseif (T_NAMESPACE === $token[0]) {
|
|
|
+ if ($inNamespace) {
|
|
|
+ $output .= "}\n";
|
|
|
+ }
|
|
|
+ $output .= $token[1];
|
|
|
+ while (($t = array_shift($tokens)) && is_array($t) && in_array($t[0], array(T_WHITESPACE, T_NS_SEPARATOR, T_STRING))) {
|
|
|
+ $output .= $t[1];
|
|
|
+ }
|
|
|
+ if (is_string($t) && '{' === $t) {
|
|
|
+ $inNamespace = false;
|
|
|
+ array_unshift($tokens, $t);
|
|
|
+ } else {
|
|
|
+ $output .= "\n{";
|
|
|
+ $inNamespace = true;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ $output .= $token[1];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if ($inNamespace) {
|
|
|
+ $output .= "}\n";
|
|
|
+ }
|
|
|
+ return $output;
|
|
|
+ }
|
|
|
+ static protected function writeCacheFile($file, $content)
|
|
|
+ {
|
|
|
+ $tmpFile = tempnam(dirname($file), basename($file));
|
|
|
+ if (false !== @file_put_contents($tmpFile, $content) && @rename($tmpFile, $file)) {
|
|
|
+ chmod($file, 0644);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ throw new \RuntimeException(sprintf('Failed to write cache file "%s".', $file));
|
|
|
+ }
|
|
|
+ static protected function stripComments($source)
|
|
|
+ {
|
|
|
+ if (!function_exists('token_get_all')) {
|
|
|
+ return $source;
|
|
|
+ }
|
|
|
+ $output = '';
|
|
|
+ foreach (token_get_all($source) as $token) {
|
|
|
+ if (is_string($token)) {
|
|
|
+ $output .= $token;
|
|
|
+ } elseif (!in_array($token[0], array(T_COMMENT, T_DOC_COMMENT))) {
|
|
|
+ $output .= $token[1];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ $output = preg_replace(array('/\s+$/Sm', '/\n+/S'), "\n", $output);
|
|
|
+ return $output;
|
|
|
+ }
|
|
|
+}
|
|
|
+}
|
|
|
+namespace Symfony\Component\ClassLoader
|
|
|
+{
|
|
|
class UniversalClassLoader
|
|
|
{
|
|
|
protected $namespaces = array();
|