mirror of
https://gitee.com/fastadminnet/framework.git
synced 2026-07-01 20:52:48 +08:00
应用模块的命名空间调整 为 app根命名空间(可设置APP_NAMESPACE常量)
并且支持没有模块的情况(模块为空) default_module参数和COMMON_MODULE常量设置为空字符串
This commit is contained in:
1
base.php
1
base.php
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
// 获取控制器名
|
||||
|
||||
@@ -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];");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?php
|
||||
namespace {$module}\controller;
|
||||
namespace {$app}\{$module}controller;
|
||||
|
||||
class Index
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user