Пример #1
0
 /**
  * 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;
 }