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