/** * retorna o controller que sera executado * * @return ControllerAbstract * @throws ControllerException * */ public function controller() { $config = $this->config(); $request = $this->request(); $module = $request->getModule(); $funcionality = $request->getFuncionality(); $action = $request->getAction(); $namespace = $config->get('app.namespace') . self::NAMESPACE_SEPARATOR; if (TRUE === Request::$useModule) { $namespace .= $module; } $namespace .= sprintf('%1$s%2$s%1$smvcb%1$scontroller%1$s%3$sController', self::NAMESPACE_SEPARATOR, $funcionality, ucfirst($funcionality)); $fullpath = Location::realpathFromNamespace($namespace) . '.php'; ControllerException::throwsExceptionIfParamIsNull(is_file($fullpath), "Controller::{$funcionality} não implementada"); $ctrl = new $namespace(); ControllerException::throwsExceptionIfParamIsNull($ctrl->hasAction($action), "Action '{$namespace}::{$action}' não existe."); return $ctrl; }
/** * Este método é utilizado para redirecionar o fluxo da requisição. * * @param string $action * @param string $controller * @param string[] $params * @throws ControllerException * @example ControllerAbstract::_forward * @code * <?php * ... * // Redirecionamento para método dentro do Controller em uso. * public function defaultAction () * { * $this->_forward('fooAction', NULL, NULL); * } * * ... * // Redirecionamento para método em controller diferente do em uso. * public function defaultAction () * { * $this->_forward('barAction', BarController, array('bar' => TRUE)); * } * * ... * ?> * @encode * */ protected final function _forward($action, $controller = NULL, array $params = NULL) { if (NULL === $controller) { $controller = $this; } else { ControllerException::throwsExceptionIfParamIsNull('string' == gettype($controller), self::T_CONTROLLER_INVALID_TYPE_OF_CONTROLLER); $controller = new $controller(); } if (NULL != $params) { $this->request()->setParams($params); } if (!strstr($action, 'Action')) { $action .= 'Action'; } if (!$controller->hasAction($action)) { throw new ControllerException(sprintf(self::t_CONTROLLER_NON_EXISTENT_ACTION, $action)); } # @todo remover este die() e implementar com o controle de dispatcher // @codeCoverageIgnoreStart die($controller->{$action}()); // @codeCoverageIgnoreEnd }