/** * 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(); } }