恢复单入口多模块支持
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);
|
// Framework::debug(true);
|
||||||
// 可使用常量DEBUG取得该值
|
// 可使用常量DEBUG取得该值
|
||||||
|
|
||||||
// 项目目录,无缺省值,必须指定
|
// 项目目录,缺省值:./application/
|
||||||
// Framework::appPath('../application/');
|
// Framework::appPath('../application/');
|
||||||
// 可使用常量APP_PATH取得该值
|
// 可使用常量APP_PATH取得该值
|
||||||
|
|
||||||
|
@ -51,18 +51,24 @@ require '../framework/Framework.php';
|
||||||
// 可使用常量SESSION_PATH取得该值
|
// 可使用常量SESSION_PATH取得该值
|
||||||
|
|
||||||
// 框架目录,缺省值:Framework.php的绝对路径
|
// 框架目录,缺省值:Framework.php的绝对路径
|
||||||
// Framework::frameworkPath('../framework');
|
// Framework::frameworkPath('../framework/');
|
||||||
// 可使用常量FRAMEWORK_PATH取得该值
|
// 可使用常量FRAMEWORK_PATH取得该值
|
||||||
|
|
||||||
// 静态资源目录,缺省值:/resource/
|
// 静态资源目录,缺省值:/resource/
|
||||||
// Framework::resourcePath('/resource/');
|
// Framework::resourcePath('/resource/');
|
||||||
// 可使用常量RESOURCE取得该值
|
// 可使用常量RESOURCE取得该值
|
||||||
|
|
||||||
// 绑定模块,缺省值:home
|
// 默认模块,缺省值:home
|
||||||
// Framework::bindModule('index');
|
// Framework::defaultModule('home');
|
||||||
// 可使用常量BIND_MODULE取得该值
|
// 可使用常量DEFAULT_MODULE取得该值
|
||||||
|
|
||||||
|
// 绑定模块,缺省值:home
|
||||||
|
// Framework::bindModule('home');
|
||||||
|
// 可使用常量BIND_MODULE取得该值,定义该常量后,每个模块需要单独入口文件
|
||||||
|
|
||||||
|
// 启动应用
|
||||||
Framework::appPath('../application/');
|
Framework::appPath('../application/');
|
||||||
|
Framework::bindModule('home');
|
||||||
Framework::startApp();
|
Framework::startApp();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -75,7 +81,7 @@ Framework::startApp();
|
||||||
php create.php 目录 模块名 [入口文件]
|
php create.php 目录 模块名 [入口文件]
|
||||||
```
|
```
|
||||||
|
|
||||||
进入framework/create/目录,执行以下命令:
|
进入根目录,执行以下命令:
|
||||||
```
|
```
|
||||||
php create.php application home index
|
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')) {
|
if (defined('APP_PATH')) {
|
||||||
self::debug();
|
self::debug();
|
||||||
// self::appPath();
|
// self::appPath();
|
||||||
self::bindModule();
|
self::defaultModule();
|
||||||
self::appNameSpace();
|
self::appNameSpace();
|
||||||
self::resourcePath();
|
self::resourcePath();
|
||||||
self::frameworkPath();
|
self::frameworkPath();
|
||||||
self::sessionPath();
|
self::sessionPath();
|
||||||
|
|
||||||
// 配置文件目录
|
|
||||||
!defined('CONFIG_DIR') && define('CONFIG_DIR', APP_PATH . BIND_MODULE . DS . 'config' . DS);
|
|
||||||
|
|
||||||
require 'library/Application.php';
|
require 'library/Application.php';
|
||||||
Application::run($autoLoadMap);
|
Application::run($autoLoadMap);
|
||||||
} else echo '请使用Framework::appPath()指定应用目录';
|
} else echo '请使用Framework::appPath()指定应用目录';
|
||||||
|
@ -70,6 +67,18 @@ class Framework
|
||||||
(!defined('DEBUG')) && define('DEBUG', $status);
|
(!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
|
* @param string $module
|
||||||
|
|
|
@ -36,9 +36,9 @@ return [
|
||||||
'engine' => 'Top',
|
'engine' => 'Top',
|
||||||
'tagLib' => [],
|
'tagLib' => [],
|
||||||
'ext' => 'html',
|
'ext' => 'html',
|
||||||
'dir' => APP_PATH . BIND_MODULE . '/view/',
|
'dir' => APP_PATH . CURRENT_MODULE . '/view/',
|
||||||
'cacheDir' => './runtime/cache/application/' . BIND_MODULE . '/',
|
'cacheDir' => './runtime/cache/application/' . CURRENT_MODULE . '/',
|
||||||
'compileDir' => './runtime/compile/application/' . BIND_MODULE . '/',
|
'compileDir' => './runtime/compile/application/' . CURRENT_MODULE . '/',
|
||||||
'left' => '<',
|
'left' => '<',
|
||||||
'right' => '>',
|
'right' => '>',
|
||||||
'cacheTime' => 5
|
'cacheTime' => 5
|
||||||
|
|
|
@ -164,9 +164,3 @@ class Create
|
||||||
$this->createFunctions();
|
$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取得该值
|
// 可使用常量SESSION_PATH取得该值
|
||||||
|
|
||||||
// 框架目录,缺省值:Framework.php的绝对路径
|
// 框架目录,缺省值:Framework.php的绝对路径
|
||||||
// Framework::frameworkPath('../framework');
|
// Framework::frameworkPath('../framework/');
|
||||||
// 可使用常量FRAMEWORK_PATH取得该值
|
// 可使用常量FRAMEWORK_PATH取得该值
|
||||||
|
|
||||||
// 静态资源目录,缺省值:/resource/
|
// 静态资源目录,缺省值:/resource/
|
||||||
// Framework::resourcePath('/resource/');
|
// Framework::resourcePath('/resource/');
|
||||||
// 可使用常量RESOURCE取得该值
|
// 可使用常量RESOURCE取得该值
|
||||||
|
|
||||||
|
// 默认模块,缺省值:home
|
||||||
|
// Framework::defaultModule('home');
|
||||||
|
// 可使用常量DEFAULT_MODULE取得该值
|
||||||
|
|
||||||
|
// 绑定模块,缺省值:home
|
||||||
|
// Framework::bindModule('home');
|
||||||
|
// 可使用常量BIND_MODULE取得该值,定义该常量后,每个模块需要单独入口文件
|
||||||
|
|
||||||
|
// 启动应用
|
||||||
Framework::appPath('../application/');
|
Framework::appPath('../application/');
|
||||||
Framework::bindModule('{name}');
|
Framework::bindModule('home');
|
||||||
Framework::startApp();
|
Framework::startApp();
|
||||||
|
|
|
@ -58,19 +58,9 @@ class Application
|
||||||
// 系统函数库
|
// 系统函数库
|
||||||
require FRAMEWORK_PATH . 'library' . DS . 'functions' . DS . 'functions.php';
|
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 = Router::instance(Request::instance());
|
||||||
|
$router->isBindModule(defined('BIND_MODULE'));
|
||||||
|
|
||||||
// 处理请求并得到数据
|
// 处理请求并得到数据
|
||||||
$response = Response::instance()->header([
|
$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
|
* @param $className
|
||||||
|
|
|
@ -29,22 +29,34 @@ class Router
|
||||||
private $request = null;
|
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.
|
* Router constructor.
|
||||||
|
@ -91,7 +103,7 @@ class Router
|
||||||
*/
|
*/
|
||||||
public function module()
|
public function module()
|
||||||
{
|
{
|
||||||
return BIND_MODULE;
|
return $this->module;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -112,6 +124,15 @@ class Router
|
||||||
return $this->params;
|
return $this->params;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否绑定模块
|
||||||
|
* @param bool $isBindModule
|
||||||
|
*/
|
||||||
|
public function isBindModule($isBindModule)
|
||||||
|
{
|
||||||
|
$this->isBindModule = $isBindModule;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查找最适合的路由匹配
|
* 查找最适合的路由匹配
|
||||||
* @param $rules
|
* @param $rules
|
||||||
|
@ -182,11 +203,12 @@ class Router
|
||||||
{
|
{
|
||||||
// 普通处理
|
// 普通处理
|
||||||
$uriArray = explode('/', trim($uri, '/'));
|
$uriArray = explode('/', trim($uri, '/'));
|
||||||
|
// 如果没有参数,则使用默认的控制器和方法
|
||||||
$uriArray[0] = (isset($uriArray[0]) && $uriArray[0]) ? $uriArray[0] : config('default_controller');
|
$uriArray[0] = (isset($uriArray[0]) && $uriArray[0]) ? $uriArray[0] : config('default_controller');
|
||||||
$uriArray[1] = (isset($uriArray[1]) && $uriArray[1]) ? $uriArray[1] : config('default_method');
|
$uriArray[1] = (isset($uriArray[1]) && $uriArray[1]) ? $uriArray[1] : config('default_method');
|
||||||
|
|
||||||
$controller = ucfirst($uriArray[0]);
|
$controller = ucfirst($uriArray[0]);
|
||||||
$rule['class'] = APP_NS . '\\' . BIND_MODULE . '\\controller\\' . $controller;
|
$rule['class'] = APP_NS . '\\' . $this->module . '\\controller\\' . $controller;
|
||||||
$rule['method'] = $uriArray[1];
|
$rule['method'] = $uriArray[1];
|
||||||
|
|
||||||
return [
|
return [
|
||||||
|
@ -240,8 +262,31 @@ class Router
|
||||||
public function execute()
|
public function execute()
|
||||||
{
|
{
|
||||||
try {
|
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) {
|
} catch (RouteException $exception) {
|
||||||
if (!DEBUG) { // 非调试模式直接404
|
if (!DEBUG) { // 非调试模式直接404
|
||||||
return \response()->code(404)->send();
|
return \response()->code(404)->send();
|
||||||
|
@ -308,8 +353,8 @@ class Router
|
||||||
public function handler($uri)
|
public function handler($uri)
|
||||||
{
|
{
|
||||||
// 检查模块是否存在
|
// 检查模块是否存在
|
||||||
if (!is_dir(APP_PATH . BIND_MODULE)) {
|
if (!is_dir(APP_PATH . $this->module)) {
|
||||||
throw new RouteException('不存在的模块:' . BIND_MODULE);
|
throw new RouteException('不存在的模块:' . $this->module);
|
||||||
}
|
}
|
||||||
// 如果为空则默认为/
|
// 如果为空则默认为/
|
||||||
$uri = $uri ? $uri : '/';
|
$uri = $uri ? $uri : '/';
|
||||||
|
@ -349,13 +394,13 @@ class Router
|
||||||
*/
|
*/
|
||||||
public function getRouteConfig()
|
public function getRouteConfig()
|
||||||
{
|
{
|
||||||
$fileName = './runtime/' . BIND_MODULE . '_route_cache.php';
|
$fileName = './runtime/' . $this->module . '_route_cache.php';
|
||||||
if (!DEBUG && is_file($fileName)) {
|
if (!DEBUG && is_file($fileName)) {
|
||||||
return require $fileName;
|
return require $fileName;
|
||||||
} else {
|
} else {
|
||||||
$result = [];
|
$result = [];
|
||||||
$controllerPath = APP_PATH . BIND_MODULE . '/controller/';
|
$controllerPath = APP_PATH . $this->module . '/controller/';
|
||||||
$namespace = APP_NS . '\\' . BIND_MODULE . '\\controller';
|
$namespace = APP_NS . '\\' . $this->module . '\\controller';
|
||||||
$files = scandir($controllerPath);
|
$files = scandir($controllerPath);
|
||||||
for ($i = 2; $i < count($files); $i++) {
|
for ($i = 2; $i < count($files); $i++) {
|
||||||
$className = $namespace . '\\' . pathinfo($files[$i])['filename'];
|
$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