当前位置:首页 > CMS教程 > 其它CMS > 列表

Zend Framework动作助手Redirector用法实例详解

发布:smiling 来源: PHP粉丝网  添加日期:2021-07-13 14:53:08 浏览: 评论:0 

本文实例讲述了Zend Framework动作助手Redirector用法,分享给大家供大家参考,具体如下:

Redirector 提供另一种实现方式,帮助程序重定向到内部或者外部页面;

转向器(Redirector)助手让你使用一个转向器对象帮助程序重定向到新的URL。与_redirect()方法相比,它具有多项优势。例如能够在转向器对象中预先配置整个站点的行为,或者使用与Zend_Controller_Action::_forward()相似的gotoSimple($action, $controller, $module, $params)接口。

转向器拥有影响重定向行为的大量方法:

setCode() 设置重定向过程中使用的HTTP响应码。

setExit() 在重定向后强制执行exit()方法。默认已设定。

setGotoSimple()设置默认的URL,当没有提供参数给gotoSimple()方法时转向该URL。可以使用类似Zend_Controller_Action::_forward()的API:setGotoSimple($action, $controller = null, $module = null, array $params = array());

setGotoRoute()设置基于一个注册路由器的URL,通过传入一个键/值数组和一个路由器名,它将根据路由器的类型和定义来组织URL。

setGotoUrl()设置默认的URL,当没有参数传入gotoUrl(),将使用该URL,接受单个URL字符串。

setPrependBase()在setGotoUrl()、gotoUrl()或者gotoUrlAndExit()指定的URL前面,加入请求对象的基地址(base URL)。

setUseAbsoluteUri()强制转向器在重定向时使用绝对的URI。当该选项设定后,将使用$_SERVER['HTTP_HOST']、 $_SERVER['SERVER_PORT']和 $_SERVER['HTTPS']以及重定向方法指定的URL,来形成一个完整的URI。该选项目前默认关闭,将来的版本可能会默认开启。

此外,转向器中还有大量方法来执行实际的重定向。

gotoSimple()使用setGotoSimple()(类似_forward()的API)来构建URL并执行重定向。

gotoRoute()使用setGotoRoute()(路由组装route-assembly)来构建URL并执行重定向。

gotoUrl()使用setGotoUrl() URL字符串)来构造URL并执行重定向。

最后,你可以在任何时刻使用getRedirectUrl()确定当前的重定向URL。

基础用例

Example #5 设定选项

这个例子改变了几个选项,包括设定重定向时使用的HTTP状态码为303,重定向时不默认退出,以及定义了默认的URL供重定向使用。

  1. class SomeController extends Zend_Controller_Action 
  2.   /** 
  3.    * Redirector - defined for code completion 
  4.    * 
  5.    * @var Zend_Controller_Action_Helper_Redirector 
  6.    */ 
  7.   protected $_redirector = null; 
  8.   public function init() 
  9.   { 
  10.     $this->_redirector = $this->_helper->getHelper('Redirector'); 
  11.     // Set the default options for the redirector 
  12.     // Since the object is registered in the helper broker, these 
  13.     // become relevant for all actions from this point forward 
  14.     $this->_redirector->setCode(303) 
  15.              ->setExit(false) 
  16.              ->setGotoSimple("this-action"
  17.                      "some-controller"); 
  18.   } 
  19.   public function myAction() 
  20.   { 
  21.     /* do some stuff */ 
  22.     // Redirect to a previously registered URL, and force an exit 
  23.     // to occur when done: 
  24.     $this->_redirector->redirectAndExit(); 
  25.     return// never reached 
  26.   } 

Example #6 使用默认设定

这个例子假定使用默认设定,也就意味着任何重定向将导致立即退出。

  1. // ALTERNATIVE EXAMPLE 
  2. class AlternativeController extends Zend_Controller_Action 
  3.   /** 
  4.    * Redirector - defined for code completion 
  5.    * 
  6.    * @var Zend_Controller_Action_Helper_Redirector 
  7.    */ 
  8.   protected $_redirector = null; 
  9.   public function init() 
  10.   { 
  11.     $this->_redirector = $this->_helper->getHelper('Redirector'); 
  12.   } 
  13.   public function myAction() 
  14.   { 
  15.     /* do some stuff */ 
  16.     $this->_redirector 
  17.       ->gotoUrl('/my-controller/my-action/param1/test/param2/test2'); 
  18.     return// never reached since default is to goto and exit 
  19.   } 

Example #7 使用goto()的_forward()API

gotoSimple()'s API 模拟了Zend_Controller_Action::_forward()。主要的不同在于它通过传入的参数构造URL,使用默认路由器的默认格式:module/:controller/:action/*。然后重定向而不是继续动作链循环。

  1. class ForwardController extends Zend_Controller_Action 
  2.   /** 
  3.    * Redirector - defined for code completion 
  4.    * 
  5.    * @var Zend_Controller_Action_Helper_Redirector 
  6.    */ 
  7.   protected $_redirector = null; 
  8.   public function init() 
  9.   { 
  10.     $this->_redirector = $this->_helper->getHelper('Redirector'); 
  11.   } 
  12.   public function myAction() 
  13.   { 
  14.     /* do some stuff */ 
  15.     // Redirect to 'my-action' of 'my-controller' in the current 
  16.     // module, using the params param1 => test and param2 => test2 
  17.     $this->_redirector->gotoSimple('my-action'
  18.     'my-controller'
  19.     null, 
  20.     array('param1' => 'test'
  21.        'param2' => 'test2' 
  22.        ) 
  23.     ); 
  24.   } 

Example #8 通过gotoRoute()使用路由组装(route assembly)

下面的例子使用了路由器的assemble()方法,基于传入参数的关联数组来创建URL,假定下面的路由已经注册:

  1. $route = new Zend_Controller_Router_Route( 
  2.   'blog/:year/:month/:day/:id'
  3.   array('controller' => 'archive'
  4.      'module' => 'blog'
  5.      'action' => 'view'
  6. ); 
  7. $router->addRoute('blogArchive'$route); 

给定一个数组,其中年份为2006,月份为4,日期为24,id为42,据此可以组装URL/blog/2006/4/24/42。

  1. class BlogAdminController extends Zend_Controller_Action 
  2.   /** 
  3.    * Redirector - defined for code completion 
  4.    * 
  5.    * @var Zend_Controller_Action_Helper_Redirector 
  6.    */ 
  7.   protected $_redirector = null; 
  8.   public function init() 
  9.   { 
  10.     $this->_redirector = $this->_helper->getHelper('Redirector'); 
  11.   } 
  12.   public function returnAction() 
  13.   { 
  14.     /* do some stuff */ 
  15.     // Redirect to blog archive. Builds the following URL: 
  16.     // /blog/2006/4/24/42 
  17.     $this->_redirector->gotoRoute( 
  18.       array('year' => 2006, 
  19.          'month' => 4, 
  20.          'day' => 24, 
  21.          'id' => 42), 
  22.       'blogArchive' 
  23.     ); 
  24.   } 

Zend_Controller_Action_Helper_Redirector的源码。

通过源代码不难看出实现方法,以及常见的使用方法。

  1. <?php 
  2. /** 
  3.  * @see Zend_Controller_Action_Helper_Abstract 
  4.  */ 
  5. require_once 'Zend/Controller/Action/Helper/Abstract.php'
  6. /** 
  7.  * @category  Zend 
  8.  * @package  Zend_Controller 
  9.  * @subpackage Zend_Controller_Action_Helper 
  10.  * @copyright Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com) 
  11.  * @license  http://framework.zend.com/license/new-bsd   New BSD License 
  12.  */ 
  13. class Zend_Controller_Action_Helper_Redirector extends Zend_Controller_Action_Helper_Abstract 
  14.   /** 
  15.    * HTTP status code for redirects 
  16.    * @var int 
  17.    */ 
  18.   protected $_code = 302; 
  19.   /** 
  20.    * Whether or not calls to _redirect() should exit script execution 
  21.    * @var boolean 
  22.    */ 
  23.   protected $_exit = true; 
  24.   /** 
  25.    * Whether or not _redirect() should attempt to prepend the base URL to the 
  26.    * passed URL (if it's a relative URL) 
  27.    * @var boolean 
  28.    */ 
  29.   protected $_prependBase = true; 
  30.   /** 
  31.    * Url to which to redirect 
  32.    * @var string 
  33.    */ 
  34.   protected $_redirectUrl = null; 
  35.   /** 
  36.    * Whether or not to use an absolute URI when redirecting 
  37.    * @var boolean 
  38.    */ 
  39.   protected $_useAbsoluteUri = false; 
  40.   /** 
  41.    * Whether or not to close the session before exiting 
  42.    * @var boolean 
  43.    */ 
  44.   protected $_closeSessionOnExit = true; 
  45.   /** 
  46.    * Retrieve HTTP status code to emit on {@link _redirect()} call 
  47.    * 
  48.    * @return int 
  49.    */ 
  50.   public function getCode() 
  51.   { 
  52.     return $this->_code; 
  53.   } 
  54.   /** 
  55.    * Validate HTTP status redirect code 
  56.    * 
  57.    * @param int $code 
  58.    * @throws Zend_Controller_Action_Exception on invalid HTTP status code 
  59.    * @return true 
  60.    */ 
  61.   protected function _checkCode($code
  62.   { 
  63.     $code = (int)$code
  64.     if ((300 > $code) || (307 < $code) || (304 == $code) || (306 == $code)) { 
  65.       require_once 'Zend/Controller/Action/Exception.php'
  66.       throw new Zend_Controller_Action_Exception('Invalid redirect HTTP status code (' . $code . ')'); 
  67.     } 
  68.     return true; 
  69.   } 
  70.   /** 
  71.    * Retrieve HTTP status code for {@link _redirect()} behaviour 
  72.    * 
  73.    * @param int $code 
  74.    * @return Zend_Controller_Action_Helper_Redirector Provides a fluent interface 
  75.    */ 
  76.   public function setCode($code
  77.   { 
  78.     $this->_checkCode($code); 
  79.     $this->_code = $code
  80.     return $this
  81.   } 
  82.   /** 
  83.    * Retrieve flag for whether or not {@link _redirect()} will exit when finished. 
  84.    * 
  85.    * @return boolean 
  86.    */ 
  87.   public function getExit() 
  88.   { 
  89.     return $this->_exit; 
  90.   } 
  91.   /** 
  92.    * Retrieve exit flag for {@link _redirect()} behaviour 
  93.    * 
  94.    * @param boolean $flag 
  95.    * @return Zend_Controller_Action_Helper_Redirector Provides a fluent interface 
  96.    */ 
  97.   public function setExit($flag
  98.   { 
  99.     $this->_exit = ($flag) ? true : false; 
  100.     return $this
  101.   } 
  102.   /** 
  103.    * Retrieve flag for whether or not {@link _redirect()} will prepend the 
  104.    * base URL on relative URLs 
  105.    * 
  106.    * @return boolean 
  107.    */ 
  108.   public function getPrependBase() 
  109.   { 
  110.     return $this->_prependBase; 
  111.   } 
  112.   /** 
  113.    * Retrieve 'prepend base' flag for {@link _redirect()} behaviour 
  114.    * 
  115.    * @param boolean $flag 
  116.    * @return Zend_Controller_Action_Helper_Redirector Provides a fluent interface 
  117.    */ 
  118.   public function setPrependBase($flag
  119.   { 
  120.     $this->_prependBase = ($flag) ? true : false; 
  121.     return $this
  122.   } 
  123.   /** 
  124.    * Retrieve flag for whether or not {@link redirectAndExit()} shall close the session before 
  125.    * exiting. 
  126.    * 
  127.    * @return boolean 
  128.    */ 
  129.   public function getCloseSessionOnExit() 
  130.   { 
  131.     return $this->_closeSessionOnExit; 
  132.   } 
  133.   /** 
  134.    * Set flag for whether or not {@link redirectAndExit()} shall close the session before exiting. 
  135.    * 
  136.    * @param boolean $flag 
  137.    * @return Zend_Controller_Action_Helper_Redirector Provides a fluent interface 
  138.    */ 
  139.   public function setCloseSessionOnExit($flag
  140.   { 
  141.     $this->_closeSessionOnExit = ($flag) ? true : false; 
  142.     return $this
  143.   } 
  144.   /** 
  145.    * Return use absolute URI flag 
  146.    * 
  147.    * @return boolean 
  148.    */ 
  149.   public function getUseAbsoluteUri() 
  150.   { 
  151.     return $this->_useAbsoluteUri; 
  152.   } 
  153.   /** 
  154.    * Set use absolute URI flag 
  155.    * 
  156.    * @param boolean $flag 
  157.    * @return Zend_Controller_Action_Helper_Redirector Provides a fluent interface 
  158.    */ 
  159.   public function setUseAbsoluteUri($flag = true) 
  160.   { 
  161.     $this->_useAbsoluteUri = ($flag) ? true : false; 
  162.     return $this
  163.   } 
  164.   /** 
  165.    * Set redirect in response object 
  166.    * 
  167.    * @return void 
  168.    */ 
  169.   protected function _redirect($url
  170.   { 
  171.     if ($this->getUseAbsoluteUri() && !preg_match('#^(https?|ftp)://#'$url)) { 
  172.       $host = (isset($_SERVER['HTTP_HOST'])?$_SERVER['HTTP_HOST']:''); 
  173.       $proto = (isset($_SERVER['HTTPS'])&&$_SERVER['HTTPS']!=="off") ? 'https' : 'http'
  174.       $port = (isset($_SERVER['SERVER_PORT'])?$_SERVER['SERVER_PORT']:80); 
  175.       $uri  = $proto . '://' . $host
  176.       if ((('http' == $proto) && (80 != $port)) || (('https' == $proto) && (443 != $port))) { 
  177.         // do not append if HTTP_HOST already contains port 
  178.         if (strrchr($host':') === false) { 
  179.           $uri .= ':' . $port
  180.         } 
  181.       } 
  182.       $url = $uri . '/' . ltrim($url'/'); 
  183.     } 
  184.     $this->_redirectUrl = $url
  185.     $this->getResponse()->setRedirect($url$this->getCode()); 
  186.   } 
  187.   /** 
  188.    * Retrieve currently set URL for redirect 
  189.    * 
  190.    * @return string 
  191.    */ 
  192.   public function getRedirectUrl() 
  193.   { 
  194.     return $this->_redirectUrl; 
  195.   } 
  196.   /** 
  197.    * Determine if the baseUrl should be prepended, and prepend if necessary 
  198.    * 
  199.    * @param string $url 
  200.    * @return string 
  201.    */ 
  202.   protected function _prependBase($url
  203.   { 
  204.     if ($this->getPrependBase()) { 
  205.       $request = $this->getRequest(); 
  206.       if ($request instanceof Zend_Controller_Request_Http) { 
  207.         $base = rtrim($request->getBaseUrl(), '/'); 
  208.         if (!emptyempty($base) && ('/' != $base)) { 
  209.           $url = $base . '/' . ltrim($url'/'); 
  210.         } else { 
  211.           $url = '/' . ltrim($url'/'); 
  212.         } 
  213.       } 
  214.     } 
  215.     return $url
  216.   } 
  217.   /** 
  218.    * Set a redirect URL of the form /module/controller/action/params 
  219.    * 
  220.    * @param string $action 
  221.    * @param string $controller 
  222.    * @param string $module 
  223.    * @param array $params 
  224.    * @return void 
  225.    */ 
  226.   public function setGotoSimple($action$controller = null, $module = null, array $params = array()) 
  227.   { 
  228.     $dispatcher = $this->getFrontController()->getDispatcher(); 
  229.     $request  = $this->getRequest(); 
  230.     $curModule = $request->getModuleName(); 
  231.     $useDefaultController = false; 
  232.     if (null === $controller && null !== $module) { 
  233.       $useDefaultController = true; 
  234.     } 
  235.     if (null === $module) { 
  236.       $module = $curModule
  237.     } 
  238.     if ($module == $dispatcher->getDefaultModule()) { 
  239.       $module = ''
  240.     } 
  241.     if (null === $controller && !$useDefaultController) { 
  242.       $controller = $request->getControllerName(); 
  243.       if (emptyempty($controller)) { 
  244.         $controller = $dispatcher->getDefaultControllerName(); 
  245.       } 
  246.     } 
  247.     $params[$request->getModuleKey()]   = $module
  248.     $params[$request->getControllerKey()] = $controller
  249.     $params[$request->getActionKey()]   = $action
  250.     $router = $this->getFrontController()->getRouter(); 
  251.     $url  = $router->assemble($params'default', true); 
  252.     $this->_redirect($url); 
  253.   } 
  254.   /** 
  255.    * Build a URL based on a route 
  256.    * 
  257.    * @param array  $urlOptions 
  258.    * @param string $name Route name 
  259.    * @param boolean $reset 
  260.    * @param boolean $encode 
  261.    * @return void 
  262.    */ 
  263.   public function setGotoRoute(array $urlOptions = array(), $name = null, $reset = false, $encode = true) 
  264.   { 
  265.     $router = $this->getFrontController()->getRouter(); 
  266.     $url  = $router->assemble($urlOptions$name$reset$encode); 
  267.     $this->_redirect($url); 
  268.   } 
  269.   /** 
  270.    * Set a redirect URL string 
  271.    * 
  272.    * By default, emits a 302 HTTP status header, prepends base URL as defined 
  273.    * in request object if url is relative, and halts script execution by 
  274.    * calling exit(). 
  275.    * 
  276.    * $options is an optional associative array that can be used to control 
  277.    * redirect behaviour. The available option keys are: 
  278.    * - exit: boolean flag indicating whether or not to halt script execution when done 
  279.    * - prependBase: boolean flag indicating whether or not to prepend the base URL when a relative URL is provided 
  280.    * - code: integer HTTP status code to use with redirect. Should be between 300 and 307. 
  281.    * 
  282.    * _redirect() sets the Location header in the response object. If you set 
  283.    * the exit flag to false, you can override this header later in code 
  284.    * execution. 
  285.    * 
  286.    * If the exit flag is true (true by default), _redirect() will write and 
  287.    * close the current session, if any. 
  288.    * 
  289.    * @param string $url 
  290.    * @param array $options 
  291.    * @return void 
  292.    */ 
  293.   public function setGotoUrl($urlarray $options = array()) 
  294.   { 
  295.     // prevent header injections 
  296.     $url = str_replace(array("\n""\r"), ''$url); 
  297.     if (null !== $options) { 
  298.       if (isset($options['exit'])) { 
  299.         $this->setExit(($options['exit']) ? true : false); 
  300.       } 
  301.       if (isset($options['prependBase'])) { 
  302.         $this->setPrependBase(($options['prependBase']) ? true : false); 
  303.       } 
  304.       if (isset($options['code'])) { 
  305.         $this->setCode($options['code']); 
  306.       } 
  307.     } 
  308.     // If relative URL, decide if we should prepend base URL 
  309.     if (!preg_match('|^[a-z]+://|'$url)) { 
  310.       $url = $this->_prependBase($url); 
  311.     } 
  312.     $this->_redirect($url); 
  313.   } 
  314.   /** 
  315.    * Perform a redirect to an action/controller/module with params 
  316.    * 
  317.    * @param string $action 
  318.    * @param string $controller 
  319.    * @param string $module 
  320.    * @param array $params 
  321.    * @return void 
  322.    */ 
  323.   public function gotoSimple($action$controller = null, $module = null, array $params = array()) 
  324.   { 
  325.     $this->setGotoSimple($action$controller$module$params); 
  326.     if ($this->getExit()) { 
  327.       $this->redirectAndExit(); 
  328.     } 
  329.   } 
  330.   /** 
  331.    * Perform a redirect to an action/controller/module with params, forcing an immdiate exit 
  332.    * 
  333.    * @param mixed $action 
  334.    * @param mixed $controller 
  335.    * @param mixed $module 
  336.    * @param array $params 
  337.    * @return void 
  338.    */ 
  339.   public function gotoSimpleAndExit($action$controller = null, $module = null, array $params = array()) 
  340.   { 
  341.     $this->setGotoSimple($action$controller$module$params); 
  342.     $this->redirectAndExit(); 
  343.   } 
  344.   /** 
  345.    * Redirect to a route-based URL 
  346.    * 
  347.    * Uses route's assemble method tobuild the URL; route is specified by $name; 
  348.    * default route is used if none provided. 
  349.    * 
  350.    * @param array  $urlOptions Array of key/value pairs used to assemble URL 
  351.    * @param string $name 
  352.    * @param boolean $reset 
  353.    * @param boolean $encode 
  354.    * @return void 
  355.    */ 
  356.   public function gotoRoute(array $urlOptions = array(), $name = null, $reset = false, $encode = true) 
  357.   { 
  358.     $this->setGotoRoute($urlOptions$name$reset$encode); 
  359.     if ($this->getExit()) { 
  360.       $this->redirectAndExit(); 
  361.     } 
  362.   } 
  363.   /** 
  364.    * Redirect to a route-based URL, and immediately exit 
  365.    * 
  366.    * Uses route's assemble method tobuild the URL; route is specified by $name; 
  367.    * default route is used if none provided. 
  368.    * 
  369.    * @param array  $urlOptions Array of key/value pairs used to assemble URL 
  370.    * @param string $name 
  371.    * @param boolean $reset 
  372.    * @return void 
  373.    */ 
  374.   public function gotoRouteAndExit(array $urlOptions = array(), $name = null, $reset = false) 
  375.   { 
  376.     $this->setGotoRoute($urlOptions$name$reset); 
  377.     $this->redirectAndExit(); 
  378.   } 
  379.   /** 
  380.    * Perform a redirect to a url 
  381.    * 
  382.    * @param string $url 
  383.    * @param array $options 
  384.    * @return void 
  385.    */ 
  386.   public function gotoUrl($urlarray $options = array()) 
  387.   { 
  388.     $this->setGotoUrl($url$options); 
  389.     if ($this->getExit()) { 
  390.       $this->redirectAndExit(); 
  391.     } 
  392.   } 
  393.   /** 
  394.    * Set a URL string for a redirect, perform redirect, and immediately exit 
  395.    * 
  396.    * @param string $url 
  397.    * @param array $options 
  398.    * @return void 
  399.    */ 
  400.   public function gotoUrlAndExit($urlarray $options = array()) 
  401.   { 
  402.     $this->setGotoUrl($url$options); 
  403.     $this->redirectAndExit(); 
  404.   } 
  405.   /** 
  406.    * exit(): Perform exit for redirector 
  407.    * 
  408.    * @return void 
  409.    */ 
  410.   public function redirectAndExit() 
  411.   { 
  412.     if ($this->getCloseSessionOnExit()) { 
  413.       // Close session, if started 
  414.       if (class_exists('Zend_Session', false) && Zend_Session::isStarted()) { 
  415.         Zend_Session::writeClose(); 
  416.       } elseif (isset($_SESSION)) { 
  417.         session_write_close(); 
  418.       } 
  419.     } 
  420.     $this->getResponse()->sendHeaders(); 
  421.     exit(); 
  422.   } 
  423.   /** 
  424.    * direct(): Perform helper when called as 
  425.    * $this->_helper->redirector($action, $controller, $module, $params) 
  426.    * 
  427.    * @param string $action 
  428.    * @param string $controller 
  429.    * @param string $module 
  430.    * @param array $params 
  431.    * @return void 
  432.    */ 
  433.   public function direct($action$controller = null, $module = null, array $params = array()) 
  434.   { 
  435.     $this->gotoSimple($action$controller$module$params); 
  436.   } 
  437.   /** 
  438.    * Overloading 
  439.    * 
  440.    * Overloading for old 'goto', 'setGoto', and 'gotoAndExit' methods 
  441.    * 
  442.    * @param string $method 
  443.    * @param array $args 
  444.    * @return mixed 
  445.    * @throws Zend_Controller_Action_Exception for invalid methods 
  446.    */ 
  447.   public function __call($method$args
  448.   { 
  449.     $method = strtolower($method); 
  450.     if ('goto' == $method) { 
  451.       return call_user_func_array(array($this'gotoSimple'), $args); 
  452.     } 
  453.     if ('setgoto' == $method) { 
  454.       return call_user_func_array(array($this'setGotoSimple'), $args); 
  455.     } 
  456.     if ('gotoandexit' == $method) { 
  457.       return call_user_func_array(array($this'gotoSimpleAndExit'), $args); 
  458.     } 
  459.     require_once 'Zend/Controller/Action/Exception.php'
  460.     throw new Zend_Controller_Action_Exception(sprintf('Invalid method "%s" called on redirector'$method)); 
  461.   } 
  462. }

Tags: Framework Redirector

分享到: