|
@@ -1,6 +1,8 @@
|
|
<?php
|
|
<?php
|
|
namespace Qii\Base;
|
|
namespace Qii\Base;
|
|
|
|
|
|
|
|
+use Qii\Autoloader\Factory;
|
|
|
|
+use Qii\Autoloader\Psr4;
|
|
use \Qii\Config\Register;
|
|
use \Qii\Config\Register;
|
|
use \Qii\Config\Consts;
|
|
use \Qii\Config\Consts;
|
|
use Qii\Exceptions\MethodNotFound;
|
|
use Qii\Exceptions\MethodNotFound;
|
|
@@ -93,63 +95,68 @@ class Dispatcher
|
|
$funcArgs = array_slice($args, 2);
|
|
$funcArgs = array_slice($args, 2);
|
|
}
|
|
}
|
|
array_unshift($funcArgs, $controllerName);
|
|
array_unshift($funcArgs, $controllerName);
|
|
- $psr4 = \Qii\Autoloader\Psr4::getInstance();
|
|
|
|
|
|
+ $psr4 = Psr4::getInstance();
|
|
$controllerCls = call_user_func_array(array($psr4, 'loadClass'), $funcArgs);
|
|
$controllerCls = call_user_func_array(array($psr4, 'loadClass'), $funcArgs);
|
|
|
|
|
|
/**middleWare**/
|
|
/**middleWare**/
|
|
$this->getMiddleWare($controllerCls)->gatherMiddleware();
|
|
$this->getMiddleWare($controllerCls)->gatherMiddleware();
|
|
- $pipeline = array_reduce($this->requestMiddleWare,function ($carry, $item){
|
|
|
|
|
|
+
|
|
|
|
+ $next = array_reduce($this->requestMiddleWare,function ($carry, $item){
|
|
return function () use ($carry, $item){
|
|
return function () use ($carry, $item){
|
|
return _loadClass($item)->handle(\Qii::getInstance()->request, $carry);
|
|
return _loadClass($item)->handle(\Qii::getInstance()->request, $carry);
|
|
};
|
|
};
|
|
- }, function($funcArgs, $controllerCls, $psr4, $controller, $action){$method = new \ReflectionMethod($this, 'dispatch');
|
|
|
|
- foreach($method->getParameters() as $property)
|
|
|
|
- {
|
|
|
|
- $param = $property->getName();
|
|
|
|
- $this->request->setParam($param, $$param);
|
|
|
|
- }
|
|
|
|
- $this->controllerCls = $controllerCls;
|
|
|
|
- $this->controllerCls->setRequest($this->request);
|
|
|
|
- $this->controllerCls->controller = $controllerCls;
|
|
|
|
- $this->controllerCls->controllerId = $controller;
|
|
|
|
- $this->controllerCls->actionId = $action;
|
|
|
|
-
|
|
|
|
- //查看是否设置了当前action的对应关系,如果设置了就走对应关系里边的,否则走当前类中的
|
|
|
|
- if ($this->controllerCls->actions
|
|
|
|
- && isset($this->controllerCls->actions[$action])
|
|
|
|
- && $this->controllerCls->actions[$action]) {
|
|
|
|
- $actionArgs = array();
|
|
|
|
- $actionArgs[] = $this->controllerCls->actions[$action];
|
|
|
|
- $actionCls = call_user_func_array(array($psr4, 'loadClass'), $actionArgs);
|
|
|
|
- $this->actionCls = $actionCls;
|
|
|
|
- $this->actionCls->setRequest($this->request);
|
|
|
|
- $this->actionCls->controller = $this->controllerCls;
|
|
|
|
- $this->actionCls->actionId = $action;
|
|
|
|
- $this->actionCls->controllerId = $this->controllerCls->controllerId;
|
|
|
|
- //支持多个action对应到同一个文件,如果对应的文件中存在指定的方法就直接调用
|
|
|
|
- if (method_exists($this->actionCls, $action . Register::get(Consts::APP_DEFAULT_ACTION_SUFFIX))) {
|
|
|
|
- $this->actionCls->response = $response = call_user_func_array(array($this->actionCls, $action. Register::get(Consts::APP_DEFAULT_ACTION_SUFFIX)), $funcArgs);
|
|
|
|
- }
|
|
|
|
- if(method_exists($this->actionCls, 'initialization')) {
|
|
|
|
- call_user_func_array(array($this->actionCls, 'initialization'), array($this->actionCls));
|
|
|
|
- }
|
|
|
|
- if (!method_exists($this->actionCls, 'run')) {
|
|
|
|
- throw new MethodNotFound(\Qii::i(1101, $this->controllerCls->actions[$action] . '->run'), __LINE__);
|
|
|
|
- }
|
|
|
|
- return call_user_func_array(array($this->actionCls, 'run'), array_slice($funcArgs, 1));
|
|
|
|
- }
|
|
|
|
|
|
+ }, function(){
|
|
|
|
+ return true;
|
|
|
|
+ })();
|
|
|
|
+
|
|
|
|
+ if ($next === false) {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
|
|
- if(method_exists($this->controllerCls, 'initialization')) {
|
|
|
|
- call_user_func_array(array($this->controllerCls, 'initialization'), array($this->controllerCls));
|
|
|
|
|
|
+ $method = new \ReflectionMethod($this, 'dispatch');
|
|
|
|
+ foreach($method->getParameters() as $property)
|
|
|
|
+ {
|
|
|
|
+ $param = $property->getName();
|
|
|
|
+ $this->request->setParam($param, $$param);
|
|
|
|
+ }
|
|
|
|
+ $this->controllerCls = $controllerCls;
|
|
|
|
+ $this->controllerCls->setRequest($this->request);
|
|
|
|
+ $this->controllerCls->controller = $controllerCls;
|
|
|
|
+ $this->controllerCls->controllerId = $controller;
|
|
|
|
+ $this->controllerCls->actionId = $action;
|
|
|
|
+
|
|
|
|
+ //查看是否设置了当前action的对应关系,如果设置了就走对应关系里边的,否则走当前类中的
|
|
|
|
+ if ($this->controllerCls->actions
|
|
|
|
+ && isset($this->controllerCls->actions[$action])
|
|
|
|
+ && $this->controllerCls->actions[$action]) {
|
|
|
|
+ $actionArgs = array();
|
|
|
|
+ $actionArgs[] = $this->controllerCls->actions[$action];
|
|
|
|
+ $actionCls = call_user_func_array(array($psr4, 'loadClass'), $actionArgs);
|
|
|
|
+ $this->actionCls = $actionCls;
|
|
|
|
+ $this->actionCls->setRequest($this->request);
|
|
|
|
+ $this->actionCls->controller = $this->controllerCls;
|
|
|
|
+ $this->actionCls->actionId = $action;
|
|
|
|
+ $this->actionCls->controllerId = $this->controllerCls->controllerId;
|
|
|
|
+ //支持多个action对应到同一个文件,如果对应的文件中存在指定的方法就直接调用
|
|
|
|
+ if (method_exists($this->actionCls, $action . Register::get(Consts::APP_DEFAULT_ACTION_SUFFIX))) {
|
|
|
|
+ $this->actionCls->response = call_user_func_array(array($this->actionCls, $action. Register::get(Consts::APP_DEFAULT_ACTION_SUFFIX)), $funcArgs);
|
|
|
|
+ }
|
|
|
|
+ if(method_exists($this->actionCls, 'initialization')) {
|
|
|
|
+ call_user_func_array(array($this->actionCls, 'initialization'), array($this->actionCls));
|
|
}
|
|
}
|
|
- array_shift($funcArgs);
|
|
|
|
- $actionName = $action . Register::get(Consts::APP_DEFAULT_ACTION_SUFFIX);
|
|
|
|
- if (!method_exists($this->controllerCls, $actionName) && !method_exists($this->controllerCls, '__call')) {
|
|
|
|
- throw new MethodNotFound(\Qii::i(1101, $controller . '->' . $actionName), __LINE__);
|
|
|
|
|
|
+ if (!method_exists($this->actionCls, 'run')) {
|
|
|
|
+ throw new MethodNotFound(\Qii::i(1101, $this->controllerCls->actions[$action] . '->run'), __LINE__);
|
|
}
|
|
}
|
|
- $this->controllerCls->response = $response = call_user_func_array(array($this->controllerCls, $actionName), $funcArgs);
|
|
|
|
- return $response;
|
|
|
|
- });
|
|
|
|
- return call_user_func($pipeline, $funcArgs, $controllerCls, $psr4, $controller, $action);
|
|
|
|
|
|
+ return call_user_func_array(array($this->actionCls, 'run'), array_slice($funcArgs, 1));
|
|
|
|
+ }
|
|
|
|
+ if(method_exists($this->controllerCls, 'initialization')) {
|
|
|
|
+ call_user_func_array(array($this->controllerCls, 'initialization'), array($this->controllerCls));
|
|
|
|
+ }
|
|
|
|
+ array_shift($funcArgs);
|
|
|
|
+ $actionName = $action . Register::get(Consts::APP_DEFAULT_ACTION_SUFFIX);
|
|
|
|
+ if (!method_exists($this->controllerCls, $actionName) && !method_exists($this->controllerCls, '__call')) {
|
|
|
|
+ throw new MethodNotFound(\Qii::i(1101, $controller . '->' . $actionName), __LINE__);
|
|
|
|
+ }
|
|
|
|
+ return call_user_func_array(array($this->controllerCls, $actionName), $funcArgs);
|
|
}
|
|
}
|
|
}
|
|
}
|