|
@@ -1,14 +1,27 @@
|
|
<?php
|
|
<?php
|
|
namespace Qii\Base;
|
|
namespace Qii\Base;
|
|
|
|
|
|
-use Qii\Autoloader\Psr4;
|
|
|
|
use Qii\Config\Consts;
|
|
use Qii\Config\Consts;
|
|
use Qii\Config\Register;
|
|
use Qii\Config\Register;
|
|
|
|
+use Qii\Exceptions\InvalidFormat;
|
|
use Qii\Exceptions\Variable;
|
|
use Qii\Exceptions\Variable;
|
|
use Qii\Request\Http;
|
|
use Qii\Request\Http;
|
|
|
|
|
|
/**
|
|
/**
|
|
* Route
|
|
* Route
|
|
|
|
+ * 使用方法,在路由文件夹中创建路由文件,内容如下:
|
|
|
|
+ * Route::prefix("/test")->setMiddleware([test\middleware\verify::class])->group(function($route) {
|
|
|
|
+ * // /test/testa -> test\index::indexAction
|
|
|
|
+ * $route->any('/test/testa', test\index::class);
|
|
|
|
+ * // /test2/login.html 会调用 test\index::loginAction
|
|
|
|
+ * $route->any('/test2/login', [test\index::class, 'login']);
|
|
|
|
+ * });
|
|
|
|
+
|
|
|
|
+ * Route::prefix('/test')->setMiddleware(['admin\system\middleware\user'])->group(function ($route){
|
|
|
|
+ * // /test/manage/atest.html 会调用 remote\manage::atest,以下两种写法都可以
|
|
|
|
+ * $route->any('/manage/*', [remote\manage::class, '$2']);
|
|
|
|
+ * $route->any('/manage/*', remote\manage::class.':$2');
|
|
|
|
+ * });
|
|
*/
|
|
*/
|
|
class Route
|
|
class Route
|
|
{
|
|
{
|
|
@@ -363,12 +376,38 @@ class Route
|
|
$res = call_user_func_array($callable, $args);
|
|
$res = call_user_func_array($callable, $args);
|
|
break;
|
|
break;
|
|
case is_array($callable):
|
|
case is_array($callable):
|
|
- $action = (isset($callable[1]) ? $callable[1] : "index"). Register::get(Consts::APP_DEFAULT_ACTION_SUFFIX);
|
|
|
|
- $controllerCls = _loadClass($callable[0]);
|
|
|
|
|
|
+ case gettype($callable) == 'string':
|
|
|
|
+ //支持路由格式
|
|
|
|
+ // $route->any('/default/*', ['class', '$2']); 这里的$2值的是request->get(2)这个值
|
|
|
|
+ if(is_array($callable)) {
|
|
|
|
+ $action = (isset($callable[1]) ? $callable[1] : Register::get("APP_DEFAULT_ACTION"));
|
|
|
|
+
|
|
|
|
+ $controllerCls = _loadClass($callable[0]);
|
|
|
|
+ }else{
|
|
|
|
+ if(strpos($callable, ":") > 0) {
|
|
|
|
+ $split = explode(":", $callable);
|
|
|
|
+ $callable = $split[0];
|
|
|
|
+ $action = $split[1];
|
|
|
|
+ }else{
|
|
|
|
+ $action = Register::get("APP_DEFAULT_ACTION");
|
|
|
|
+ }
|
|
|
|
+ $controllerCls = _loadClass($callable);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ preg_match('/\$\d$/', $action, $match);
|
|
|
|
+ if($match) {
|
|
|
|
+ $key = ltrim($action, '$');
|
|
|
|
+ $action = $request->get($key, Register::get("APP_DEFAULT_ACTION"));
|
|
|
|
+ }
|
|
|
|
+ $action = $action . Register::get(Consts::APP_DEFAULT_ACTION_SUFFIX);
|
|
|
|
+
|
|
|
|
+ if(preg_match("/^\d/", $action)) {
|
|
|
|
+ throw new InvalidFormat('方法名不能以数字开头');
|
|
|
|
+ }
|
|
|
|
+
|
|
if(method_exists($controllerCls, 'beforeRun') && !$controllerCls->beforeRun()) {
|
|
if(method_exists($controllerCls, 'beforeRun') && !$controllerCls->beforeRun()) {
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
-
|
|
|
|
if(count($middleware) > 0 && !$this->handleMiddleware($middleware)) {
|
|
if(count($middleware) > 0 && !$this->handleMiddleware($middleware)) {
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
@@ -380,15 +419,6 @@ class Route
|
|
}
|
|
}
|
|
$res = call_user_func_array(array($controllerCls, $action), $args);
|
|
$res = call_user_func_array(array($controllerCls, $action), $args);
|
|
break;
|
|
break;
|
|
- case gettype($callable) == 'string':
|
|
|
|
- if(count($middleware) > 0 && !$this->handleMiddleware($middleware)) {
|
|
|
|
- return true;
|
|
|
|
- }
|
|
|
|
- $res = call_user_func_array(
|
|
|
|
- array(_loadClass($callable),
|
|
|
|
- Register::get("APP_DEFAULT_ACTION"). Register::get(Consts::APP_DEFAULT_ACTION_SUFFIX)), $args);
|
|
|
|
-
|
|
|
|
- break;
|
|
|
|
}
|
|
}
|
|
if($res instanceof Response) {
|
|
if($res instanceof Response) {
|
|
echo $res->response();
|
|
echo $res->response();
|