Example #1
0
 /**
  * Processes a request and sets its controller and action.  If
  * no route was possible, default route is set.
  *
  * @param  Yaf_Request_Abstract
  * @return Yaf_Request_Abstract|boolean
  */
 public function route(Request_Abstract $request)
 {
     $requestUri = $request->getRequestUri();
     $baseuri = $request->getBaseUri();
     if ($requestUri != '' && $baseuri != '' && stripos($requestUri, $baseuri) === 0) {
         $path = substr($requestUri, strlen($baseuri));
     } else {
         $path = $requestUri;
     }
     $module = null;
     $controller = null;
     $action = null;
     $rest = null;
     $path = trim($path, Router::URI_DELIMITER);
     if ($path != '') {
         $path = explode(Router::URI_DELIMITER, $path);
         $path = array_filter($path, 'strlen');
         if (Application::isModuleName($path[0])) {
             $module = $path[0];
             array_shift($path);
         }
         if (count($path) && !empty($path[0])) {
             $controller = $path[0];
             array_shift($path);
         }
         if (count($path) && !empty($path[0])) {
             $action = $path[0];
             array_shift($path);
         }
         $rest = implode(Router::URI_DELIMITER, $path);
         $actionPrefer = G::iniGet('yaf.action_prefer');
         if ($module == null && $controller == null && $action == null) {
             if ($actionPrefer == true) {
                 $action = $rest;
             } else {
                 $controller = $rest;
             }
             $rest = null;
         } elseif ($module == null && $action == null && $rest == null) {
             if ($actionPrefer == true) {
                 $action = $controller;
                 $controller = null;
             }
         } elseif ($controller == null && $action == null && $rest != null) {
             $controller = $module;
             $action = $rest;
             $module = null;
             $rest = null;
         } elseif ($action == null && $rest == null) {
             $action = $controller;
             $controller = $module;
             $module = null;
         } elseif ($controller == null && $action == null) {
             $controller = $module;
             $action = $rest;
             $module = null;
             $rest = null;
         } elseif ($action == null) {
             $action = $rest;
             $rest = null;
         }
         if ($module != null) {
             $request->setModuleName($module);
         }
         if ($controller != null) {
             $request->setControllerName($controller);
         }
         if ($action != null) {
             $request->setActionName($action);
         }
         $params = array();
         if ($rest != null && trim($rest) != '') {
             $path = explode(Router::URI_DELIMITER, $rest);
             if (($numSegs = count($path)) != 0) {
                 for ($i = 0; $i < $numSegs; $i = $i + 2) {
                     $key = urldecode($path[$i]);
                     $val = isset($path[$i + 1]) ? urldecode($path[$i + 1]) : null;
                     $params[$key] = isset($params[$key]) ? array_merge((array) $params[$key], array($val)) : $val;
                 }
             }
             $request->setParam($params);
         }
     }
     return true;
 }
Example #2
0
 /**
  * Set the default module name
  *
  * @param string $module
  * @return Yaf_Dispatcher
  */
 public function setDefaultModule($module)
 {
     if (Application::isModuleName($module) || strtolower($module) == 'index') {
         $this->_default_module = ucfirst((string) $module);
     }
     return $this;
 }
 private function handle(Request_Abstract $request, Response_Abstract $response, View_Interface $view)
 {
     $request->setDispatched(true);
     $app = $this->getApplication();
     $appDir = $app->getAppDirectory();
     if ($appDir == '') {
         throw new Exception\StartupError('Yaf_Dispatcher requires ' . 'Yaf_Application(which set the application.directory) ' . 'to be initialized first.');
     }
     $module = $request->getModuleName();
     if (empty($module)) {
         throw new Exception\DispatchFailed('Unexcepted an empty module name');
     }
     if (!Application::isModuleName($module)) {
         throw new Exception\LoadFailed\Module('There is no module ' . $module);
     }
     $controllerName = $request->getControllerName();
     if (empty($controllerName)) {
         throw new Exception\DispatchFailed('Unexcepted an empty controller name');
     }
     $className = $this->getController($appDir, $module, $controllerName);
     if (!$className) {
         return false;
     }
     $controller = new $className($request, $response, $view);
     if (!$controller instanceof Controller_Abstract) {
         throw new Exception\TypeError('Controller must be an instance of Yaf_Controller_Abstract');
     }
     $viewDir = $view->getScriptPath();
     //template dir might be set from the __construct
     if (empty($viewDir)) {
         $templateDir = '';
         if ($this->_default_module == $module) {
             $templateDir = $appDir . DIRECTORY_SEPARATOR . Loader::YAF_VIEW_DIRECTORY_NAME;
         } else {
             $templateDir = $appDir . DIRECTORY_SEPARATOR . Loader::YAF_MODULE_DIRECTORY_NAME . DIRECTORY_SEPARATOR . $module . DIRECTORY_SEPARATOR . Loader::YAF_VIEW_DIRECTORY_NAME;
         }
         $view->setScriptPath($templateDir);
         unset($templateDir);
     }
     $action = $request->getActionName();
     $actionMethod = $action . 'Action';
     if (method_exists($controller, $actionMethod)) {
         //Get all action method parameters
         $methodParams = $this->getActionParams($className, $actionMethod);
         if (null == $methodParams) {
             $ret = call_user_func(array($controller, $actionMethod));
         } else {
             $ret = call_user_func_array(array($controller, $actionMethod), $this->prepareActionParams($request, $methodParams));
         }
         if (is_bool($ret) && $ret == false) {
             return true;
         }
     } elseif (($actionController = $this->getAction($appDir, $controller, $action, $module)) != null) {
         //check if not in actions vars we have the action
         $actionMethod = 'execute';
         if (method_exists($actionController, $actionMethod)) {
             //Get all action method parameters
             $methodParams = $this->getActionParams(get_class($actionController), $actionMethod);
             $ret = null;
             if (null == $methodParams) {
                 $ret = call_user_func(array($actionController, $actionMethod));
             } else {
                 $ret = call_user_func_array(array($actionController, $actionMethod), $this->prepareActionParams($request, $methodParams));
             }
             if (is_bool($ret) && $ret == false) {
                 return true;
             }
         } else {
             throw new Exception\LoadFailed\Action('There is no method ' . $actionMethod . ' in ' . get_class($controller) . '::$actions');
         }
     } else {
         return false;
     }
     if ($this->_auto_render == true) {
         if ($this->_instantly_flush == true) {
             $controller->display($action);
         } else {
             $ret = $controller->render($action);
             $response->setBody($ret);
         }
     }
     $controller = null;
 }