恢复单入口多模块支持
This commit is contained in:
parent
31204807fb
commit
7f90071773
18
README.md
18
README.md
|
@ -38,7 +38,7 @@ require '../framework/Framework.php';
|
|||
// Framework::debug(true);
|
||||
// 可使用常量DEBUG取得该值
|
||||
|
||||
// 项目目录,无缺省值,必须指定
|
||||
// 项目目录,缺省值:./application/
|
||||
// Framework::appPath('../application/');
|
||||
// 可使用常量APP_PATH取得该值
|
||||
|
||||
|
@ -51,18 +51,24 @@ require '../framework/Framework.php';
|
|||
// 可使用常量SESSION_PATH取得该值
|
||||
|
||||
// 框架目录,缺省值:Framework.php的绝对路径
|
||||
// Framework::frameworkPath('../framework');
|
||||
// Framework::frameworkPath('../framework/');
|
||||
// 可使用常量FRAMEWORK_PATH取得该值
|
||||
|
||||
// 静态资源目录,缺省值:/resource/
|
||||
// Framework::resourcePath('/resource/');
|
||||
// 可使用常量RESOURCE取得该值
|
||||
|
||||
// 绑定模块,缺省值:home
|
||||
// Framework::bindModule('index');
|
||||
// 可使用常量BIND_MODULE取得该值
|
||||
// 默认模块,缺省值:home
|
||||
// Framework::defaultModule('home');
|
||||
// 可使用常量DEFAULT_MODULE取得该值
|
||||
|
||||
// 绑定模块,缺省值:home
|
||||
// Framework::bindModule('home');
|
||||
// 可使用常量BIND_MODULE取得该值,定义该常量后,每个模块需要单独入口文件
|
||||
|
||||
// 启动应用
|
||||
Framework::appPath('../application/');
|
||||
Framework::bindModule('home');
|
||||
Framework::startApp();
|
||||
```
|
||||
|
||||
|
@ -75,7 +81,7 @@ Framework::startApp();
|
|||
php create.php 目录 模块名 [入口文件]
|
||||
```
|
||||
|
||||
进入framework/create/目录,执行以下命令:
|
||||
进入根目录,执行以下命令:
|
||||
```
|
||||
php create.php application home index
|
||||
```
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
<?php
|
||||
require 'framework/create/run.php';
|
||||
|
||||
// 准备创建项目
|
||||
$path = (isset($argv[1]) && $argv[1]) ? $argv[1] : exit('please type path');
|
||||
$projectName = (isset($argv[2]) && $argv[2]) ? $argv[2] : exit('please type project name');
|
||||
$startFile = (isset($argv[3]) && $argv[3]) ? $argv[3] : false;
|
||||
new Create($startFile, $path, $projectName);
|
|
@ -35,15 +35,12 @@ class Framework
|
|||
if (defined('APP_PATH')) {
|
||||
self::debug();
|
||||
// self::appPath();
|
||||
self::bindModule();
|
||||
self::defaultModule();
|
||||
self::appNameSpace();
|
||||
self::resourcePath();
|
||||
self::frameworkPath();
|
||||
self::sessionPath();
|
||||
|
||||
// 配置文件目录
|
||||
!defined('CONFIG_DIR') && define('CONFIG_DIR', APP_PATH . BIND_MODULE . DS . 'config' . DS);
|
||||
|
||||
require 'library/Application.php';
|
||||
Application::run($autoLoadMap);
|
||||
} else echo '请使用Framework::appPath()指定应用目录';
|
||||
|
@ -70,6 +67,18 @@ class Framework
|
|||
(!defined('DEBUG')) && define('DEBUG', $status);
|
||||
}
|
||||
|
||||
/**
|
||||
* 默认模块
|
||||
* @param string $module
|
||||
*/
|
||||
public static function defaultModule($module = '')
|
||||
{
|
||||
if (!defined('DEFAULT_MODULE')) {
|
||||
(!$module) && $module = 'home';
|
||||
define('DEFAULT_MODULE', $module);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 绑定模块
|
||||
* @param string $module
|
||||
|
|
|
@ -36,9 +36,9 @@ return [
|
|||
'engine' => 'Top',
|
||||
'tagLib' => [],
|
||||
'ext' => 'html',
|
||||
'dir' => APP_PATH . BIND_MODULE . '/view/',
|
||||
'cacheDir' => './runtime/cache/application/' . BIND_MODULE . '/',
|
||||
'compileDir' => './runtime/compile/application/' . BIND_MODULE . '/',
|
||||
'dir' => APP_PATH . CURRENT_MODULE . '/view/',
|
||||
'cacheDir' => './runtime/cache/application/' . CURRENT_MODULE . '/',
|
||||
'compileDir' => './runtime/compile/application/' . CURRENT_MODULE . '/',
|
||||
'left' => '<',
|
||||
'right' => '>',
|
||||
'cacheTime' => 5
|
||||
|
|
|
@ -164,9 +164,3 @@ class Create
|
|||
$this->createFunctions();
|
||||
}
|
||||
}
|
||||
|
||||
// 准备创建项目
|
||||
$path = (isset($argv[1]) && $argv[1]) ? $argv[1] : exit('please type path~');
|
||||
$projectName = (isset($argv[2]) && $argv[2]) ? $argv[2] : exit('please type project name~');
|
||||
$startFile = (isset($argv[3]) && $argv[3]) ? $argv[3] : false;
|
||||
new Create($startFile, $path, $projectName);
|
|
@ -23,13 +23,22 @@ require '../framework/Framework.php';
|
|||
// 可使用常量SESSION_PATH取得该值
|
||||
|
||||
// 框架目录,缺省值:Framework.php的绝对路径
|
||||
// Framework::frameworkPath('../framework');
|
||||
// Framework::frameworkPath('../framework/');
|
||||
// 可使用常量FRAMEWORK_PATH取得该值
|
||||
|
||||
// 静态资源目录,缺省值:/resource/
|
||||
// Framework::resourcePath('/resource/');
|
||||
// 可使用常量RESOURCE取得该值
|
||||
|
||||
// 默认模块,缺省值:home
|
||||
// Framework::defaultModule('home');
|
||||
// 可使用常量DEFAULT_MODULE取得该值
|
||||
|
||||
// 绑定模块,缺省值:home
|
||||
// Framework::bindModule('home');
|
||||
// 可使用常量BIND_MODULE取得该值,定义该常量后,每个模块需要单独入口文件
|
||||
|
||||
// 启动应用
|
||||
Framework::appPath('../application/');
|
||||
Framework::bindModule('{name}');
|
||||
Framework::bindModule('home');
|
||||
Framework::startApp();
|
||||
|
|
|
@ -58,19 +58,9 @@ class Application
|
|||
// 系统函数库
|
||||
require FRAMEWORK_PATH . 'library' . DS . 'functions' . DS . 'functions.php';
|
||||
|
||||
// 用户函数库
|
||||
$funcFile = APP_PATH . BIND_MODULE . DS . 'functions.php';
|
||||
(is_file($funcFile)) && require $funcFile;
|
||||
|
||||
// session目录
|
||||
$sessionConfig = config('session');
|
||||
if (!empty($sessionConfig) && $sessionConfig['open'] === true) {
|
||||
session_save_path(SESSION_PATH);
|
||||
session_start();
|
||||
}
|
||||
|
||||
// 初始化路由实例
|
||||
$router = Router::instance(Request::instance());
|
||||
$router->isBindModule(defined('BIND_MODULE'));
|
||||
|
||||
// 处理请求并得到数据
|
||||
$response = Response::instance()->header([
|
||||
|
@ -82,6 +72,26 @@ class Application
|
|||
|
||||
}
|
||||
|
||||
/**
|
||||
* 路由后执行
|
||||
*/
|
||||
public static function afterRouter()
|
||||
{
|
||||
// 配置文件目录
|
||||
!defined('CONFIG_DIR') && define('CONFIG_DIR', APP_PATH . CURRENT_MODULE . DS . 'config' . DS);
|
||||
|
||||
// session目录
|
||||
$sessionConfig = config('session');
|
||||
if (!empty($sessionConfig) && $sessionConfig['open'] === true) {
|
||||
session_save_path(SESSION_PATH);
|
||||
session_start();
|
||||
}
|
||||
|
||||
// 用户函数库
|
||||
$funcFile = APP_PATH . CURRENT_MODULE . DS . 'functions.php';
|
||||
(is_file($funcFile)) && require $funcFile;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取一个类反射
|
||||
* @param $className
|
||||
|
|
|
@ -29,22 +29,34 @@ class Router
|
|||
private $request = null;
|
||||
|
||||
/**
|
||||
* 类全限定名
|
||||
* @var null
|
||||
* 是否绑定模块
|
||||
* @var bool
|
||||
*/
|
||||
private $controllerFullName = null;
|
||||
private $isBindModule = false;
|
||||
|
||||
/**
|
||||
* 模块
|
||||
* @var string
|
||||
*/
|
||||
private $module = '';
|
||||
|
||||
/**
|
||||
* 类全限定名
|
||||
* @var string
|
||||
*/
|
||||
private $controllerFullName = '';
|
||||
|
||||
/**
|
||||
* 类名
|
||||
* @var null
|
||||
* @var string
|
||||
*/
|
||||
private $controller = null;
|
||||
private $controller = '';
|
||||
|
||||
/**
|
||||
* 方法
|
||||
* @var null
|
||||
* @var string
|
||||
*/
|
||||
private $method = null;
|
||||
private $method = '';
|
||||
|
||||
/**
|
||||
* 参数
|
||||
|
@ -54,9 +66,9 @@ class Router
|
|||
|
||||
/**
|
||||
* 当前加载的路由
|
||||
* @var null
|
||||
* @var array
|
||||
*/
|
||||
private $loadRuleParameters = null;
|
||||
private $loadRuleParameters = [];
|
||||
|
||||
/**
|
||||
* Router constructor.
|
||||
|
@ -91,7 +103,7 @@ class Router
|
|||
*/
|
||||
public function module()
|
||||
{
|
||||
return BIND_MODULE;
|
||||
return $this->module;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -112,6 +124,15 @@ class Router
|
|||
return $this->params;
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否绑定模块
|
||||
* @param bool $isBindModule
|
||||
*/
|
||||
public function isBindModule($isBindModule)
|
||||
{
|
||||
$this->isBindModule = $isBindModule;
|
||||
}
|
||||
|
||||
/**
|
||||
* 查找最适合的路由匹配
|
||||
* @param $rules
|
||||
|
@ -182,11 +203,12 @@ class Router
|
|||
{
|
||||
// 普通处理
|
||||
$uriArray = explode('/', trim($uri, '/'));
|
||||
// 如果没有参数,则使用默认的控制器和方法
|
||||
$uriArray[0] = (isset($uriArray[0]) && $uriArray[0]) ? $uriArray[0] : config('default_controller');
|
||||
$uriArray[1] = (isset($uriArray[1]) && $uriArray[1]) ? $uriArray[1] : config('default_method');
|
||||
|
||||
$controller = ucfirst($uriArray[0]);
|
||||
$rule['class'] = APP_NS . '\\' . BIND_MODULE . '\\controller\\' . $controller;
|
||||
$rule['class'] = APP_NS . '\\' . $this->module . '\\controller\\' . $controller;
|
||||
$rule['method'] = $uriArray[1];
|
||||
|
||||
return [
|
||||
|
@ -240,8 +262,31 @@ class Router
|
|||
public function execute()
|
||||
{
|
||||
try {
|
||||
// 绑定模块优先
|
||||
if ($this->isBindModule) {
|
||||
$this->module = BIND_MODULE;
|
||||
$uri = $this->request->uri();
|
||||
} else {
|
||||
// 如果没有直接绑定模块,则从链接获取
|
||||
$rawUri = $this->request->uri();
|
||||
if (!$rawUri) {
|
||||
$this->module = DEFAULT_MODULE;
|
||||
$uri = $rawUri;
|
||||
} else {
|
||||
// 取第一部分为模块名称
|
||||
$pos = strpos($rawUri, '/');
|
||||
if (false !== $pos) {
|
||||
$uri = substr($rawUri, $pos + 1);
|
||||
$this->module = substr($rawUri, 0, $pos);
|
||||
} else {
|
||||
$this->module = $uri = $rawUri;
|
||||
}
|
||||
}
|
||||
}
|
||||
define('CURRENT_MODULE', $this->module());
|
||||
Application::afterRouter();
|
||||
// 处理路由
|
||||
$this->handler($this->request->uri());
|
||||
$this->handler($uri);
|
||||
} catch (RouteException $exception) {
|
||||
if (!DEBUG) { // 非调试模式直接404
|
||||
return \response()->code(404)->send();
|
||||
|
@ -308,8 +353,8 @@ class Router
|
|||
public function handler($uri)
|
||||
{
|
||||
// 检查模块是否存在
|
||||
if (!is_dir(APP_PATH . BIND_MODULE)) {
|
||||
throw new RouteException('不存在的模块:' . BIND_MODULE);
|
||||
if (!is_dir(APP_PATH . $this->module)) {
|
||||
throw new RouteException('不存在的模块:' . $this->module);
|
||||
}
|
||||
// 如果为空则默认为/
|
||||
$uri = $uri ? $uri : '/';
|
||||
|
@ -349,13 +394,13 @@ class Router
|
|||
*/
|
||||
public function getRouteConfig()
|
||||
{
|
||||
$fileName = './runtime/' . BIND_MODULE . '_route_cache.php';
|
||||
$fileName = './runtime/' . $this->module . '_route_cache.php';
|
||||
if (!DEBUG && is_file($fileName)) {
|
||||
return require $fileName;
|
||||
} else {
|
||||
$result = [];
|
||||
$controllerPath = APP_PATH . BIND_MODULE . '/controller/';
|
||||
$namespace = APP_NS . '\\' . BIND_MODULE . '\\controller';
|
||||
$controllerPath = APP_PATH . $this->module . '/controller/';
|
||||
$namespace = APP_NS . '\\' . $this->module . '\\controller';
|
||||
$files = scandir($controllerPath);
|
||||
for ($i = 2; $i < count($files); $i++) {
|
||||
$className = $namespace . '\\' . pathinfo($files[$i])['filename'];
|
||||
|
|
|
@ -1,38 +0,0 @@
|
|||
<?php
|
||||
|
||||
use \top\Framework;
|
||||
|
||||
require '../framework/Framework.php';
|
||||
|
||||
// 可能你会使用到下面这些配置
|
||||
|
||||
// 调试模式,缺省值:false
|
||||
// Framework::debug(true);
|
||||
// 可使用常量DEBUG取得该值
|
||||
|
||||
// 项目目录,缺省值:./application/
|
||||
Framework::appPath('../application/');
|
||||
// 可使用常量APP_PATH取得该值
|
||||
|
||||
// 项目命名空间,缺省值:app
|
||||
// Framework::appNameSpace('app');
|
||||
// 可使用常量APP_NS取得该值
|
||||
|
||||
// session保存目录,缺省值:./runtime/session/
|
||||
// Framework::sessionPath('./runtime/session/');
|
||||
// 可使用常量SESSION_PATH取得该值
|
||||
|
||||
// 框架目录,缺省值:Framework.php的绝对路径
|
||||
// Framework::frameworkPath('../framework/');
|
||||
// 可使用常量FRAMEWORK_PATH取得该值
|
||||
|
||||
// 静态资源目录,缺省值:/resource/
|
||||
// Framework::resourcePath('/resource/');
|
||||
// 可使用常量RESOURCE取得该值
|
||||
|
||||
// 绑定模块,缺省值:home
|
||||
// Framework::bindModule('index');
|
||||
// 可使用常量BIND_MODULE取得该值
|
||||
|
||||
// 启动应用
|
||||
Framework::startApp();
|
Loading…
Reference in New Issue