/** * reroute request to a different module, controller, action * * @param Zend_Controller_Request_Http $request where we came from * @param integer|array|Zend_Config $rerouteTo where we are rerouting to: HTTP code or module/controller * @param Zend_Controller_Front* $frontController * @param bool $afterRouter Is reroute occurring after or before router has completed? * @return array returns $config as array */ public static function reroute(Zend_Controller_Request_Http $request, $rerouteTo, $frontController, $reason = null, $afterRouter = false) { // normalize the destination information, mapping error codes to configured controllers, if needed if (is_int($rerouteTo)) { $config = self::$registry['config']; if (empty($config->error->{$rerouteTo})) { $code = '404'; } else { $code = $rerouteTo; } $rerouteTo = $config->error->{$code}; } if ($rerouteTo instanceof Zend_Config) { $rerouteTo = $rerouteTo->toArray(); } if (!isset($rerouteTo['code'])) { $rerouteTo['code'] = 200; } if (!is_array($rerouteTo)) { throw new ZFDemo_Exception(_('CRITICAL reroute() destination unusable (type "%1$s")', gettype($rerouteTo)), 500); } if ($reason === null && isset($rerouteTo['reason'])) { $reason = $rerouteTo['reason']; } ZFDemo_Log::logReroute($request, $rerouteTo, $reason); // log reroute "from" and "to" if (empty($rerouteTo['moduleName'])) { throw new ZFDemo_Exception(_('CRITICAL reroute() destination module missing'), 500); } if (empty($rerouteTo['controllerName'])) { throw new ZFDemo_Exception(_('CRITICAL reroute() destination controller missing'), 500); } if (empty($rerouteTo['actionName'])) { throw new ZFDemo_Exception(_('CRITICAL reroute() destination action missing'), 500); } $dispatcher = $frontController->getDispatcher(); // make original request available to the controller via both ->_getParam() and ->getInvokeArg() $dispatcher->setParam('origRequest', clone $request); // accessible via $dispatcher->setParam('rerouteToReason', $reason); if ($afterRouter) { // rerouting after the router has completed requires a different technique: $request->setModuleName($rerouteTo['moduleName'])->setControllerName($rerouteTo['controllerName'])->setActionName($rerouteTo['actionName'])->setParam('error', $reason)->setParam('origRequestUri', $request->REQUEST_URI)->setDispatched(false); } else { // rerouting setup, when the router will be used (i.e. before routing): $request->setPathInfo(($rerouteTo['moduleName'] === 'default' ? '' : '/' . $rerouteTo['moduleName']) . '/' . $rerouteTo['controllerName'] . '/' . $rerouteTo['actionName']); } return $rerouteTo; }