应用模块的命名空间调整 为 app根命名空间(可设置APP_NAMESPACE常量)

并且支持没有模块的情况(模块为空) default_module参数和COMMON_MODULE常量设置为空字符串
This commit is contained in:
thinkphp
2016-01-02 18:41:53 +08:00
parent f4c498d3c3
commit e33ec863fe
6 changed files with 84 additions and 58 deletions

View File

@@ -24,6 +24,7 @@ defined('CORE_PATH') or define('CORE_PATH', LIB_PATH . 'think' . DS);
defined('ORG_PATH') or define('ORG_PATH', LIB_PATH . 'org' . DS);
defined('TRAIT_PATH') or define('TRAIT_PATH', LIB_PATH . 'traits' . DS);
defined('APP_PATH') or define('APP_PATH', dirname($_SERVER['SCRIPT_FILENAME']) . DS);
defined('APP_NAMESPACE') or define('APP_NAMESPACE', 'app');
defined('COMMON_MODULE') or define('COMMON_MODULE', 'common');
defined('RUNTIME_PATH') or define('RUNTIME_PATH', realpath(APP_PATH) . DS . 'runtime' . DS);
defined('DATA_PATH') or define('DATA_PATH', RUNTIME_PATH . 'data' . DS);

View File

@@ -95,7 +95,7 @@ class App
}
if (!$instance) {
throw new Exception('class [ ' . MODULE_NAME . '\\' . CONTROLLER_LAYER . '\\' . Loader::parseName(str_replace('.', '\\', CONTROLLER_NAME), 1) . ' ] not exists', 10001);
throw new Exception('class [ ' . Loader::parseClass(MODULE_NAME, CONTROLLER_LAYER, CONTROLLER_NAME) . ' ] not exists', 10001);
}
try {
// 操作方法开始监听
@@ -266,7 +266,7 @@ class App
// 监听path_info
APP_HOOK && Hook::listen('path_info');
// 分析PATHINFO信息
if (!isset($_SERVER['PATH_INFO']) && $_SERVER['SCRIPT_NAME'] != $_SERVER['PHP_SELF']) {
if (!isset($_SERVER['PATH_INFO'])) {
foreach ($config['pathinfo_fetch'] as $type) {
if (!empty($_SERVER[$type])) {
$_SERVER['PATH_INFO'] = (0 === strpos($_SERVER[$type], $_SERVER['SCRIPT_NAME'])) ?
@@ -324,30 +324,36 @@ class App
}
$module = strtolower($result[0] ?: $config['default_module']);
if ($maps = $config['url_module_map']) {
if (isset($maps[$module])) {
// 记录当前别名
define('MODULE_ALIAS', $module);
// 获取实际的项目名
$module = $maps[MODULE_ALIAS];
} elseif (array_search($module, $maps)) {
// 禁止访问原始项目
$module = '';
if ($module) {
if ($maps = $config['url_module_map']) {
if (isset($maps[$module])) {
// 记录当前别名
define('MODULE_ALIAS', $module);
// 获取实际的项目名
$module = $maps[MODULE_ALIAS];
} elseif (array_search($module, $maps)) {
// 禁止访问原始项目
$module = '';
}
}
}
// 获取模块名称
define('MODULE_NAME', defined('BIND_MODULE') ? BIND_MODULE : strip_tags($module));
// 获取模块名称
define('MODULE_NAME', defined('BIND_MODULE') ? BIND_MODULE : strip_tags($module));
// 模块初始化
if (MODULE_NAME && !in_array(MODULE_NAME, $config['deny_module_list']) && is_dir(APP_PATH . MODULE_NAME)) {
APP_HOOK && Hook::listen('app_begin');
define('MODULE_PATH', APP_PATH . MODULE_NAME . DS);
define('VIEW_PATH', MODULE_PATH . VIEW_LAYER . DS);
// 模块初始化
if (MODULE_NAME && !in_array(MODULE_NAME, $config['deny_module_list']) && is_dir(APP_PATH . MODULE_NAME)) {
APP_HOOK && Hook::listen('app_begin');
define('MODULE_PATH', APP_PATH . MODULE_NAME . DS);
define('VIEW_PATH', MODULE_PATH . VIEW_LAYER . DS);
// 初始化模块
self::initModule(MODULE_NAME, $config);
// 初始化模块
self::initModule(MODULE_NAME, $config);
} else {
throw new Exception('module [ ' . MODULE_NAME . ' ] not exists ', 10005);
}
} else {
throw new Exception('module [ ' . MODULE_NAME . ' ] not exists ', 10005);
define('MODULE_NAME', '');
define('MODULE_PATH', APP_PATH);
define('VIEW_PATH', MODULE_PATH . VIEW_LAYER . DS);
}
// 获取控制器名

View File

@@ -18,10 +18,8 @@ class Build
$lockfile = APP_PATH . 'build.lock';
if (is_writable($lockfile)) {
return;
} else {
if (!touch($lockfile)) {
throw new Exception('应用目录[' . APP_PATH . ']不可写,目录无法自动生成!<BR>请手动生成项目目录~', 10006);
}
} elseif (!touch($lockfile)) {
throw new Exception('应用目录[' . APP_PATH . ']不可写,目录无法自动生成!<BR>请手动生成项目目录~', 10006);
}
foreach ($build as $module => $list) {
if ('__dir__' == $module) {
@@ -71,13 +69,12 @@ class Build
// 创建模块目录
mkdir(APP_PATH . $module);
}
if ('runtime' != $module) {
if (basename(RUNTIME_PATH) != $module) {
// 创建配置文件和公共文件
self::buildCommon($module);
// 创建模块的默认页面
self::buildHello($module);
}
// 创建子目录和文件
foreach ($list as $path => $file) {
$modulePath = APP_PATH . $module . DS;
@@ -99,13 +96,14 @@ class Build
} else {
// 生成相关MVC文件
foreach ($file as $val) {
$filename = $modulePath . $path . DS . Loader::parseName($val) . EXT;
$filename = $modulePath . $path . DS . Loader::parseName($val) . EXT;
$namespace = APP_NAMESPACE . '\\' . ($module ? $module . '\\' : '') . $path;
switch ($path) {
case CONTROLLER_LAYER: // 控制器
$content = "<?php\nnamespace {$module}\\{$path};\n\nclass {$val} {\n\n}";
$content = "<?php\nnamespace {$namespace};\n\nclass {$val} {\n\n}";
break;
case MODEL_LAYER: // 模型
$content = "<?php\nnamespace {$module}\\{$path};\n\nclass {$val} extends \Think\Model{\n\n}";
$content = "<?php\nnamespace {$namespace};\n\nclass {$val} extends \Think\Model{\n\n}";
break;
case VIEW_LAYER: // 视图
$filename = $modulePath . $path . DS . Loader::parseName($val) . '.html';
@@ -117,7 +115,7 @@ class Build
break;
default:
// 其他文件
$content = "<?php\nnamespace {$module}\\{$path};\n\nclass {$val} {\n\n}";
$content = "<?php\nnamespace {$namespace};\n\nclass {$val} {\n\n}";
}
if (!is_file($filename)) {
@@ -131,12 +129,12 @@ class Build
// 创建欢迎页面
protected static function buildHello($module)
{
$filename = APP_PATH . $module . DS . CONTROLLER_LAYER . DS . Config::get('default_module') . EXT;
$filename = APP_PATH . ($module ? $module . DS : '') . CONTROLLER_LAYER . DS . Config::get('default_controller') . EXT;
if (!is_file($filename)) {
$content = file_get_contents(THINK_PATH . 'tpl' . DS . 'default_index.tpl');
$content = str_replace('{$module}', $module, $content);
if (!is_dir(APP_PATH . $module . DS . CONTROLLER_LAYER)) {
mkdir(APP_PATH . $module . DS . CONTROLLER_LAYER);
$content = str_replace(['{$app}', '{$module}'], [APP_NAMESPACE, $module ? $module . '\\' : ''], $content);
if (!is_dir(dirname($filename))) {
mkdir(dirname($filename), 0777, true);
}
file_put_contents($filename, $content);
}
@@ -145,8 +143,9 @@ class Build
// 创建模块公共文件
protected static function buildCommon($module)
{
if (!is_file(APP_PATH . $module . DS . 'config.php')) {
file_put_contents(APP_PATH . $module . DS . 'config.php', "<?php\nreturn [\n\n];");
$filename = APP_PATH . ($module ? $module . DS : '') . 'config.php';
if (!is_file($filename)) {
file_put_contents($filename, "<?php\nreturn [\n\n];");
}
}
}

View File

@@ -26,30 +26,33 @@ class Loader
// 自动加载
public static function autoload($class)
{
// 检查是否定义classmap
// 检查是否定义类库映射
if (isset(self::$map[$class])) {
if (is_file(self::$map[$class])) {
include self::$map[$class];
}
} elseif ($file = self::findFileInComposer($class)) {
// Composer自动加载
include $file;
} else {
// 命名空间自动加载
$name = strtolower(strstr($class, '\\', true));
if (isset(self::$namespace[$name])) {
// 注册的命名空间
$path = dirname(self::$namespace[$name]) . DS;
$path = self::$namespace[$name];
} elseif (in_array($name, ['think', 'behavior', 'traits']) || is_dir(LIB_PATH . $name)) {
// Library目录下面的命名空间自动定位
$path = LIB_PATH;
} elseif (is_dir(EXTEND_PATH . $name)) {
// 扩展类库命名空间
$path = EXTEND_PATH;
} else {
// 核心类库命名空间
$path = LIB_PATH . $name;
} elseif (APP_NAMESPACE == $name) {
// 项目命名空间
$path = APP_PATH;
} elseif (is_dir(EXTEND_PATH . $name)) {
// 扩展类库命名空间
$path = EXTEND_PATH . $name;
} else {
return;
}
$filename = $path . str_replace('\\', DS, str_replace('\\_', '\\', strtolower(trim(preg_replace("/[A-Z]/", "_\\0", $class), "_")))) . EXT;
$filename = $path . str_replace('\\', DS, str_replace('\\_', '\\', strtolower(trim(preg_replace("/[A-Z]/", "_\\0", strstr($class, '\\')), "_")))) . EXT;
if (is_file($filename)) {
include $filename;
}
@@ -258,12 +261,12 @@ class Loader
} else {
$module = MODULE_NAME;
}
$class = $module . '\\' . $layer . '\\' . self::parseName(str_replace('/', '\\', $name), 1);
$class = self::parseClass($module, $layer, $name);
$name = basename($name);
if (class_exists($class)) {
$model = new $class($name);
} else {
$class = COMMON_MODULE . strstr($class, '\\');
$class = str_replace('\\' . $module . '\\', '\\' . COMMON_MODULE . '\\', $class);
if (class_exists($class)) {
$model = new $class($name);
} else {
@@ -294,13 +297,12 @@ class Loader
} else {
$module = MODULE_NAME;
}
$class = $module . '\\' . $layer . '\\' . self::parseName(str_replace('.', '\\', $name), 1);
$class = self::parseClass($module, $layer, $name);
if (class_exists($class)) {
$action = new $class;
$_instance[$name . $layer] = $action;
return $action;
} elseif ($empty && class_exists($module . '\\' . $layer . '\\' . $empty)) {
$class = $module . '\\' . $layer . '\\' . $empty;
} elseif ($empty && class_exists($class = self::parseClass($module, $layer, $empty))) {
return new $class;
} else {
return false;
@@ -385,4 +387,16 @@ class Loader
return strtolower(trim(preg_replace("/[A-Z]/", "_\\0", $name), "_"));
}
}
/**
* 解析应用类的类名
* @param string $module 模块名
* @param string $layer 层名 controller model ...
* @param string $name 类名
* @return string
*/
public static function parseClass($module, $layer, $name)
{
return APP_NAMESPACE . '\\' . ($module ? $module . '\\' : '') . $layer . '\\' . self::parseName(str_replace('/', '\\', $name), 1);
}
}

View File

@@ -43,15 +43,21 @@ class Url
$url = str_replace('/', $depr, $url);
}
// 解析模块、控制器和操作
$url = trim($url, $depr);
$path = explode($depr, $url);
$var = [];
$var['action'] = !empty($path) ? array_pop($path) : ACTION_NAME;
$url = trim($url, $depr);
$path = explode($depr, $url);
$var = [];
if (!defined('BIND_ACTION')) {
$var['action'] = !empty($path) ? array_pop($path) : ACTION_NAME;
}
if (!defined('BIND_CONTROLLER')) {
$var['controller'] = !empty($path) ? array_pop($path) : CONTROLLER_NAME;
}
if (!defined('BIND_MODULE')) {
$var['module'] = !empty($path) ? array_pop($path) : MODULE_NAME;
if (!empty($path)) {
$var['module'] = array_pop($path);
} elseif (MODULE_NAME) {
$var['module'] = MODULE_NAME;
}
}
}
}

View File

@@ -1,5 +1,5 @@
<?php
namespace {$module}\controller;
namespace {$app}\{$module}controller;
class Index
{