From 9beac2bba404f2ff49f6510915b13d0534866757 Mon Sep 17 00:00:00 2001 From: thinkphp Date: Wed, 22 Jun 2016 17:53:00 +0800 Subject: [PATCH] =?UTF-8?q?Loader=E7=B1=BBscanComposerPackage=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E5=A2=9E=E5=8A=A0classmap=E8=A7=A3=E6=9E=90=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- library/think/Loader.php | 54 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 5 deletions(-) diff --git a/library/think/Loader.php b/library/think/Loader.php index 334f2a1e..dddc4163 100644 --- a/library/think/Loader.php +++ b/library/think/Loader.php @@ -172,23 +172,48 @@ class Loader foreach ($dirs as $dir) { if ('.' != $dir && '..' != $dir && is_dir($path . $dir) && is_file($path . $dir . DS . 'composer.json')) { // 解析Composer 包 - $content = file_get_contents($path . $dir . DS . 'composer.json'); + $package = $path . $dir . DS; + $content = file_get_contents($package . 'composer.json'); $result = json_decode($content, true); if (!empty($result['autoload'])) { $autoload = $result['autoload']; if (isset($autoload['psr-0'])) { - foreach ($autoload['psr-0'] as $ns => $path) { - $namespace[rtrim($ns, '\\')] = realpath($package . $path . DS . str_replace('\\', DS, $ns)) . DS; + foreach ($autoload['psr-0'] as $ns => $val) { + $namespace[rtrim($ns, '\\')] = realpath($package . $val . DS . str_replace('\\', DS, $ns)) . DS; } } if (isset($autoload['psr-4'])) { - foreach ($autoload['psr-4'] as $ns => $path) { - $namespace[rtrim($ns, '\\')] = realpath($package . $path) . DS; + foreach ($autoload['psr-4'] as $ns => $val) { + $namespace[rtrim($ns, '\\')] = realpath($package . $val) . DS; } } + if (isset($autoload['classmap'])) { + foreach ($autoload['classmap'] as $val) { + if (strpos($val, '/')) { + // 扫描目录 + $files = scandir($package . $val); + foreach ($files as $file) { + if ('php' == pathinfo($file, PATHINFO_EXTENSION)) { + $file = realpath($package . $val . DS . $file); + $info = self::parsePhpNamespace($file); + foreach ($info as $class) { + $classmap[$class] = $file; + } + } + } + } else { + // 解析文件 + $file = realpath($package . $val); + $info = self::parsePhpNamespace($file); + foreach ($info as $class) { + $classmap[$class] = $file; + } + } + } + } if (isset($autoload['files'])) { foreach ($autoload['files'] as $file) { $files[] = realpath($package . $file); @@ -200,6 +225,25 @@ class Loader return ['namespace' => $namespace, 'files' => $files, 'classmap' => $classmap]; } + private static function parsePhpNamespace($file) + { + $content = php_strip_whitespace($file); + $content = substr($content, 5); + if (0 === strpos(ltrim($content), 'namespace')) { + preg_match('/\snamespace\s(.*?);/', $content, $matches); + $namespace = $matches[1] . '\\'; + } else { + $namespace = ''; + } + preg_match_all('/\sclass\s(\w+)\s?\{/', $content, $matches); + + $info = []; + foreach ($matches[1] as $class) { + $info[] = $namespace . $class; + } + return $info; + } + // 注册composer自动加载 private static function registerComposerLoader() {