Dispatcher.php 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. <?php
  2. namespace Qii\Base;
  3. class Dispatcher
  4. {
  5. public $request;
  6. public function __construct()
  7. {
  8. }
  9. /**
  10. * 设置请求
  11. * @param \Qii\Request\Http $request 当前请求
  12. */
  13. public function setRequest(\Qii\Request\Http $request)
  14. {
  15. $this->request = $request;
  16. return $this;
  17. }
  18. /**
  19. * 转发
  20. * @param string $controller
  21. * @param string $action
  22. * @return mixed
  23. */
  24. public function dispatch($controller = '', $action = '')
  25. {
  26. $args = func_get_args();
  27. $controller = $controller != '' ? $controller : $this->request->getControllerName();
  28. $action = $action != '' ? $action : $this->request->getActionName();
  29. $controllerName = \Qii\Config\Register::get(\Qii\Config\Consts::APP_DEFAULT_CONTROLLER_PREFIX) . '_' . $controller;
  30. $funcArgs = array();
  31. if (count($args) > 2) {
  32. $funcArgs = array_slice($args, 2);
  33. }
  34. array_unshift($funcArgs, $controllerName);
  35. $psr4 = \Qii\Autoloader\Psr4::getInstance();
  36. $controllerCls = call_user_func_array(array($psr4, 'loadClass'), $funcArgs);
  37. $controllerCls->setRequest($this->request);
  38. $controllerCls->controller = $controllerCls;
  39. $controllerCls->controllerId = $controller;
  40. $controllerCls->actionId = $action;
  41. $response = null;
  42. //查看是否设置了当前action的对应关系,如果设置了就走对应关系里边的,否则走当前类中的
  43. if ($controllerCls->actions && isset($controllerCls->actions[$action]) && $controllerCls->actions[$action]) {
  44. $actionArgs = array();
  45. $actionArgs[] = $controllerCls->actions[$action];
  46. $actionCls = call_user_func_array(array($psr4, 'loadClass'), $actionArgs);
  47. $actionCls->setRequest($this->request);
  48. $actionCls->controller = $controllerCls;
  49. $actionCls->actionId = $action;
  50. $actionCls->controllerId = $controllerCls->controllerId;
  51. //支持多个action对应到同一个文件,如果对应的文件中存在指定的方法就直接调用
  52. if (method_exists($actionCls, $action . \Qii\Config\Register::get(\Qii\Config\Consts::APP_DEFAULT_ACTION_SUFFIX))) {
  53. $actionCls->response = $response = call_user_func_array(array($actionCls, $action. \Qii\Config\Register::get(\Qii\Config\Consts::APP_DEFAULT_ACTION_SUFFIX)), $funcArgs);
  54. }
  55. if (!method_exists($actionCls, 'run')) {
  56. throw new \Qii\Exceptions\MethodNotFound(\Qii::i(1101, $controllerCls->actions[$action] . '->run'), __LINE__);
  57. }
  58. $response = call_user_func_array(array($actionCls, 'run'), $funcArgs);
  59. } else {
  60. array_shift($funcArgs);
  61. $actionName = $action . \Qii\Config\Register::get(\Qii\Config\Consts::APP_DEFAULT_ACTION_SUFFIX);
  62. if (!method_exists($controllerCls, $actionName) && !method_exists($controllerCls, '__call')) {
  63. throw new \Qii\Exceptions\MethodNotFound(\Qii::i(1101, $controller . '->' . $actionName), __LINE__);
  64. }
  65. $controllerCls->response = $response = call_user_func_array(array($controllerCls, $actionName), $funcArgs);
  66. }
  67. return $response;
  68. }
  69. }