Пример #1
0
 /**
  * Dispatch an HTTP request to a controller/action.
  *
  * @param string $url Optional argument Url with routing informatins
  */
 public function dispatch($url = false, $return = false)
 {
     if (empty($this->router)) {
         $this->setRouter(new Router());
     }
     if (!$url) {
         $url = $this->getUrlParams();
     }
     $url = trim($url, "/");
     $route = $this->router->getRoute($url);
     if ($route['executeDir']) {
         $url = preg_replace("#^" . $route['executeDir'] . "/?#", "", $url);
     }
     $this->lastUrl = $url;
     $params = explode("/", $url);
     $index = 0;
     $route['path'] = $route['executeDir'] ? $route['executeDir'] . "/" : "";
     $this->setExecuteDir($route['executeDir']);
     if ($route['executeDir']) {
         $controllerDir = CODE_ROOT_DIR . $route['path'] . "controllers/";
         Config::set("LANGUAGES_PATH", CODE_ROOT_DIR . $route['path'] . "languages/");
         Config::set('TEMPLATES_PATH', CODE_ROOT_DIR . $route['path'] . "templates/");
     } else {
         $controllerDir = Config::get('CONTROLLERS_PATH');
     }
     $controllerName = empty($params[$index]) ? "" : basename($params[$index]);
     $index++;
     $controllerAction = empty($params[$index]) ? "" : basename($params[$index]);
     if (empty($controllerName) && !empty($controllerAction)) {
         $this->return404();
     }
     if (empty($controllerName)) {
         $controllerName = "Main";
     }
     if (empty($controllerAction)) {
         $controllerAction = "index";
     }
     $controllerActionMethod = $controllerAction . "Action";
     $controllerClassName = NameTool::getControllerClassName($controllerName, $route['executeDir']);
     $controllerFileName = NameTool::getControllerFileName($controllerName);
     $controllerPath = $controllerDir . $controllerFileName;
     if (!isset($controllers[$controllerClassName])) {
         if (!file_exists($controllerPath)) {
             return $this->throwError("Missed controller file: {$controllerPath}");
         }
         require_once $controllerPath;
         if (!class_exists($controllerClassName)) {
             return $this->throwError("Missed controller class" . ": {$controllerClassName}");
         }
         static $controllers = array();
         $controllers[$controllerClassName] = new $controllerClassName($this);
     }
     $controller = $controllers[$controllerClassName];
     $controller->action = $controllerAction;
     $controller->localDir = $route['path'];
     if (!is_callable(array($controller, $controllerActionMethod))) {
         return $this->throwError("Missed action method" . ": {$controllerActionMethod}");
     }
     if (is_callable(array($controller, "init"))) {
         call_user_func_array(array($controller, "init"), array());
     }
     $params = array_slice($params, 2);
     $result = call_user_func_array(array($controller, $controllerActionMethod), $params);
     if ($return || $result !== null) {
         return $result !== null ? $result : $controller->render();
     } else {
         echo $controller->render();
     }
 }