Example #1
0
 /**
  * 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);
         }
     }
 }