/** * Handles the routing process. * Auto routing, sub folder, subdomain, sub folder on subdomain are supported. * It can be used with or without the <i>index.php</i> in the URI * @return mixed HTTP status code such as 404 or URL for redirection */ public function routeTo() { $router = new DooUriRouter(); $routeRs = $router->execute($this->route, Doo::conf()->SUBFOLDER); if ($routeRs[0] !== null && $routeRs[1] !== null) { //dispatch, call Controller class if ($routeRs[0][0] !== '[') { if (strpos($routeRs[0], '\\') !== false) { $nsClassFile = str_replace('\\', '/', $routeRs[0]); $nsClassFile = explode(Doo::conf()->APP_NAMESPACE_ID . '/', $nsClassFile, 2); $nsClassFile = $nsClassFile[1]; require_once Doo::conf()->SITE_PATH . Doo::conf()->PROTECTED_FOLDER . $nsClassFile . '.php'; } else { require_once Doo::conf()->SITE_PATH . Doo::conf()->PROTECTED_FOLDER . "controller/{$routeRs[0]}.php"; } } else { $moduleParts = explode(']', $routeRs[0]); $moduleName = substr($moduleParts[0], 1); if (isset(Doo::conf()->PROTECTED_FOLDER_ORI) === true) { require_once Doo::conf()->SITE_PATH . Doo::conf()->PROTECTED_FOLDER_ORI . 'module/' . $moduleName . '/controller/' . $moduleParts[1] . '.php'; } else { require_once Doo::conf()->SITE_PATH . Doo::conf()->PROTECTED_FOLDER . 'module/' . $moduleName . '/controller/' . $moduleParts[1] . '.php'; Doo::conf()->PROTECTED_FOLDER_ORI = Doo::conf()->PROTECTED_FOLDER; } //set class name $routeRs[0] = $moduleParts[1]; Doo::conf()->PROTECTED_FOLDER = Doo::conf()->PROTECTED_FOLDER_ORI . 'module/' . $moduleName . '/'; } if (strpos($routeRs[0], '/') !== false) { $clsname = explode('/', $routeRs[0]); $routeRs[0] = $clsname[sizeof($clsname) - 1]; } //if defined class name, use the class name to create the Controller object $clsnameDefined = sizeof($routeRs) === 4; if ($clsnameDefined) { $controller = new $routeRs[3](); } else { $controller = new $routeRs[0](); } $controller->params = $routeRs[2]; if (isset($controller->params['__extension']) === true) { $controller->extension = $controller->params['__extension']; unset($controller->params['__extension']); } if (isset($controller->params['__routematch']) === true) { $controller->routematch = $controller->params['__routematch']; unset($controller->params['__routematch']); } if ($_SERVER['REQUEST_METHOD'] === 'PUT') { $controller->init_put_vars(); } //before run, normally used for ACL auth if ($clsnameDefined) { if ($rs = $controller->beforeRun($routeRs[3], $routeRs[1])) { return $rs; } } else { if ($rs = $controller->beforeRun($routeRs[0], $routeRs[1])) { return $rs; } } $routeRs = $controller->{$routeRs}[1](); $controller->afterRun($routeRs); return $routeRs; } else { if (Doo::conf()->AUTOROUTE) { list($controller_name, $method_name, $method_name_ori, $params, $moduleName) = $router->auto_connect(Doo::conf()->SUBFOLDER, isset($this->route['autoroute_alias']) === true ? $this->route['autoroute_alias'] : null); if (empty($this->route['autoroute_force_dash']) === false) { if ($method_name !== 'index' && $method_name === $method_name_ori && ctype_lower($method_name_ori) === false) { $this->throwHeader(404); return; } } if (isset($moduleName) === true) { Doo::conf()->PROTECTED_FOLDER_ORI = Doo::conf()->PROTECTED_FOLDER; Doo::conf()->PROTECTED_FOLDER = Doo::conf()->PROTECTED_FOLDER_ORI . 'module/' . $moduleName . '/'; } $controller_file = Doo::conf()->SITE_PATH . Doo::conf()->PROTECTED_FOLDER . "controller/{$controller_name}.php"; if (file_exists($controller_file)) { require_once $controller_file; $methodsArray = get_class_methods($controller_name); //if the method not in controller class, check for a namespaced class with the same file name. if ($methodsArray === null && isset(Doo::conf()->APP_NAMESPACE_ID) === true) { if (isset($moduleName) === true) { $controller_name = Doo::conf()->APP_NAMESPACE_ID . '\\module\\' . $moduleName . '\\controller\\' . $controller_name; } else { $controller_name = Doo::conf()->APP_NAMESPACE_ID . '\\controller\\' . $controller_name; } $methodsArray = get_class_methods($controller_name); } //if method not found in both both controller and namespaced controller, 404 error if ($methodsArray === null) { if (isset(Doo::conf()->PROTECTED_FOLDER_ORI) === true) { Doo::conf()->PROTECTED_FOLDER = Doo::conf()->PROTECTED_FOLDER_ORI; } $this->throwHeader(404); return; } } else { if (isset($moduleName) === true && isset(Doo::conf()->APP_NAMESPACE_ID) === true) { if (isset(Doo::conf()->PROTECTED_FOLDER_ORI) === true) { Doo::conf()->PROTECTED_FOLDER = Doo::conf()->PROTECTED_FOLDER_ORI; } $controller_file = Doo::conf()->SITE_PATH . Doo::conf()->PROTECTED_FOLDER . '/controller/' . $moduleName . '/' . $controller_name . '.php'; if (file_exists($controller_file) === false) { $this->throwHeader(404); return; } $controller_name = Doo::conf()->APP_NAMESPACE_ID . '\\controller\\' . $moduleName . '\\' . $controller_name; #echo 'module = '.$moduleName.'<br>'; #echo $controller_file.'<br>'; #echo $controller_name.'<br>'; $methodsArray = get_class_methods($controller_name); } else { if (isset(Doo::conf()->PROTECTED_FOLDER_ORI) === true) { Doo::conf()->PROTECTED_FOLDER = Doo::conf()->PROTECTED_FOLDER_ORI; } $this->throwHeader(404); return; } } //check for REST request as well, utilized method_GET(), method_PUT(), method_POST, method_DELETE() $restMethod = $method_name . '_' . strtolower($_SERVER['REQUEST_METHOD']); $inRestMethod = in_array($restMethod, $methodsArray); //check if method() and method_GET() etc. doesn't exist in the controller, 404 error if (in_array($method_name, $methodsArray) === false && $inRestMethod === false) { if (isset(Doo::conf()->PROTECTED_FOLDER_ORI) === true) { Doo::conf()->PROTECTED_FOLDER = Doo::conf()->PROTECTED_FOLDER_ORI; } $this->throwHeader(404); return; } //use method_GET() etc. if available if ($inRestMethod === true) { $method_name = $restMethod; } $controller = new $controller_name(); //if autoroute in this controller is disabled, 404 error if ($controller->autoroute === false) { if (isset(Doo::conf()->PROTECTED_FOLDER_ORI) === true) { Doo::conf()->PROTECTED_FOLDER = Doo::conf()->PROTECTED_FOLDER_ORI; } $this->throwHeader(404); } if ($params != null) { $controller->params = $params; } if ($_SERVER['REQUEST_METHOD'] === 'PUT') { $controller->initPutVars(); } //before run, normally used for ACL auth if ($rs = $controller->beforeRun($controller_name, $method_name)) { return $rs; } $routeRs = $controller->{$method_name}(); $controller->afterRun($routeRs); return $routeRs; } else { $this->throwHeader(404); } } }
public function route_to() { $router = new DooUriRouter(); $routeRs = $router->execute($this->route, Doo::conf()->SUBFOLDER); if ($routeRs[0] != NULL && $routeRs[1] != NULL) { require_once Doo::conf()->SITE_PATH . "protected/controller/{$routeRs[0]}.php"; if (strpos($routeRs[0], '/') !== FALSE) { $clsname = explode('/', $routeRs[0]); $routeRs[0] = $clsname[sizeof($clsname) - 1]; } $clsnameDefined = sizeof($routeRs) === 4; if ($clsnameDefined) { $controller = new $routeRs[3](); } else { $controller = new $routeRs[0](); } $controller->params = $routeRs[2]; if (isset($controller->params['__extension'])) { $controller->extension = $controller->params['__extension']; unset($controller->params['__extension']); } if ($_SERVER['REQUEST_METHOD'] === 'PUT') { $controller->init_put_vars(); } //before run, normally used for ACL auth if ($clsnameDefined) { if ($rs = $controller->beforeRun($routeRs[3], $routeRs[1])) { return $rs; } } else { if ($rs = $controller->beforeRun($routeRs[0], $routeRs[1])) { return $rs; } } return $controller->{$routeRs}[1](); } else { if (Doo::conf()->AUTOROUTE) { list($controller_name, $method_name, $params) = $router->auto_connect(Doo::conf()->SUBFOLDER); $controller_file = Doo::conf()->SITE_PATH . "protected/controller/{$controller_name}.php"; if (file_exists($controller_file)) { require_once $controller_file; $controller = new $controller_name(); if (!$controller->autoroute) { $this->throwHeader(404); } if ($params != NULL) { $controller->params = $params; } if ($_SERVER['REQUEST_METHOD'] === 'PUT') { $controller->init_put_vars(); } if (method_exists($controller, $method_name)) { return $controller->{$method_name}(); } else { $this->throwHeader(404); } } else { $this->throwHeader(404); } } else { $this->throwHeader(404); } } }