示例#1
0
 public function dispatch(Request $request, Response $response)
 {
     $controllerParam = $request->getParam('controller', 'Error');
     $actionParam = $request->getParam('action', 'error404');
     $controllerClass = 'Application\\Controller\\' . implode('', array_map('ucfirst', explode('-', $controllerParam))) . 'Controller';
     $actionMethod = implode('', array_map('ucfirst', explode('-', $actionParam))) . 'Action';
     $actionMethod = strtolower(substr($actionMethod, 0, 1)) . substr($actionMethod, 1);
     if (!class_exists($controllerClass, true)) {
         $controllerClass = 'Application\\Controller\\ErrorController';
         $actionMethod = 'error404Action';
         $request->setParams(array('action' => '404', 'controller' => 'error'));
     }
     /** @var $controller AbstractAction */
     $controller = new $controllerClass($request, $response);
     $classMethods = get_class_methods($controller);
     if (!in_array($actionMethod, get_class_methods($controller))) {
         $controllerClass = 'Application\\Controller\\ErrorController';
         $actionMethod = 'error404Action';
         // controller => 'name', action => 'name', param => 'name'
         $request->setParams(array('action' => '404', 'controller' => 'error'));
         /** @var $controller AbstractAction */
         $controller = new $controllerClass($request, $response);
     }
     if (in_array('preDispatch', $classMethods)) {
         $controller->preDispatch();
     }
     if (!$controller->getBreakRun() && empty($forward)) {
         $actionResponse = $controller->{$actionMethod}();
         $forward = $controller->getForward();
         if (!empty($forward)) {
             $request->setParams($forward);
             $controller->removeForward();
             return $this->dispatch($request, $response);
         }
         if (in_array('postDispatch', $classMethods)) {
             $controller->postDispatch();
         }
     }
     //        print_r($response); echo 123123; die;
     return $response;
 }