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

Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解

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

这篇文章主要介绍了Zend Framework动作助手(Zend_Controller_Action_Helper)用法,详细分析了动作助手Zend_Controller_Action_Helper功能,定义,使用方法与相关实现代码,需要的朋友可以参考下。

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

通过助手模式,可以把一些经常使用的功能模块做封装,从而在可以在需要的地方灵活使用,主要是在action使用。

Zend Framework中有两种助手,动作助手(Zend_Controller_Action_Helper)和试图助手(Zend_View_Helper)。

动作助手可以向任何Zend_Controller_Action的衍生动作控制器中,即时的加入功能(runtime and/or on-demand functionality),以使得增加公共的动作控制器功能时,尽量减少衍生动作控制器类的必要。

动作助手在需要调用时加载,可以在请求的时候(bootstrap)或者动作控制器创建的时候(init())实例化。

涉及到的相关文件

在/library/Zend/Controller/Action/中

  1. │  Exception.php 
  2. │  HelperBroker.php 
  3. │  Interface.php 
  4. │ 
  5. ├─Helper 
  6. │  │  Abstract.php 
  7. │  │  ActionStack.php 
  8. │  │  AjaxContext.php 
  9. │  │  AutoCompleteDojo.php 
  10. │  │  AutoCompleteScriptaculous.php 
  11. │  │  Cache.php 
  12. │  │  ContextSwitch.php 
  13. │  │  FlashMessenger.php 
  14. │  │  Json.php 
  15. │  │  Redirector.php 
  16. │  │  Url.php 
  17. │  │  ViewRenderer.php 
  18. │  │ 
  19. │  └─AutoComplete 
  20. │          Abstract.php 
  21. │ 
  22. └─HelperBroker 
  23.        PriorityStack.php 

常见的动作助手有:

FlashMessenger 用来处理Flash Messenger会话;

Json 用来解码和发送 JSON 响应;

Url  用于创建Urls;

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

ViewRenderer 自动的完成在控制器内建立视图对象并渲染视图的过程;

AutoComplete 自动响应 AJAX 的自动完成;

ContextSwitch 和 AjaxContext 为你的动作提供替代响应格式;

Cache  实现cache的相关操作;

ActionStack 用于操作动作堆栈。

动手的几种实例化使用方式

1.通过Zend_Controller_Action的 $_helper成员的getHelper()方法。直接调用getHelper(),传入助手的名称即可。

  1. $redirector = $this->_helper->getHelper('Redirector'); 
  2. //$redirector->getName(); 
  3. $redirector->gotoSimple('index2'); 

2.直接通过访问的_helper助手的属性对应的助手对象。

$redirector = $this->_helper->Redirector;

Zend_Controller_Action_HelperBroker

中文名称译作"助手经纪人",顾名思义,是动作助手的中间人。

在动作的实例化使用的方式的第二种方式就是通过Zend_Controller_Action_HelperBroker的魔术方法__get()来实现的。

助手经纪人用于注册助手对象和助手路径以及获取助手等等功能。

Zend_Controller_Action_HelperBroker的实现以及常用方法列表

  1. <?php 
  2. /** 
  3.  * @see Zend_Controller_Action_HelperBroker_PriorityStack 
  4.  */ 
  5. require_once 'Zend/Controller/Action/HelperBroker/PriorityStack.php'; 
  6. /** 
  7.  * @see Zend_Loader 
  8.  */ 
  9. require_once 'Zend/Loader.php'; 
  10. /** 
  11.  * @category  Zend 
  12.  * @package  Zend_Controller 
  13.  * @subpackage Zend_Controller_Action 
  14.  * @copyright Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com) 
  15.  * @license  http://framework.zend.com/license/new-bsd   New BSD License 
  16.  */ 
  17. class Zend_Controller_Action_HelperBroker 
  18. { 
  19.   /** 
  20.    * $_actionController - ActionController reference 
  21.    * 
  22.    * @var Zend_Controller_Action 
  23.    */ 
  24.   protected $_actionController; 
  25.   /** 
  26.    * @var Zend_Loader_PluginLoader_Interface 
  27.    */ 
  28.   protected static $_pluginLoader; 
  29.   /** 
  30.    * $_helpers - Helper array 
  31.    * 
  32.    * @var Zend_Controller_Action_HelperBroker_PriorityStack 
  33.    */ 
  34.   protected static $_stack = null; 
  35.   /** 
  36.    * Set PluginLoader for use with broker 
  37.    * 
  38.    * @param Zend_Loader_PluginLoader_Interface $loader 
  39.    * @return void 
  40.    */ 
  41.   public static function setPluginLoader($loader) 
  42.   { 
  43.     if ((null !== $loader) && (!$loader instanceof Zend_Loader_PluginLoader_Interface)) { 
  44.       require_once 'Zend/Controller/Action/Exception.php'; 
  45.       throw new Zend_Controller_Action_Exception('Invalid plugin loader provided to HelperBroker'); 
  46.     } 
  47.     self::$_pluginLoader = $loader; 
  48.   } 
  49.   /** 
  50.    * Retrieve PluginLoader 
  51.    * 
  52.    * @return Zend_Loader_PluginLoader 
  53.    */ 
  54.   public static function getPluginLoader() 
  55.   { 
  56.     if (null === self::$_pluginLoader) { 
  57.       require_once 'Zend/Loader/PluginLoader.php'; 
  58.       self::$_pluginLoader = new Zend_Loader_PluginLoader(array( 
  59.         'Zend_Controller_Action_Helper' => 'Zend/Controller/Action/Helper/', 
  60.       )); 
  61.     } 
  62.     return self::$_pluginLoader; 
  63.   } 
  64.   /** 
  65.    * addPrefix() - Add repository of helpers by prefix 
  66.    * 
  67.    * @param string $prefix 
  68.    */ 
  69.   static public function addPrefix($prefix) 
  70.   { 
  71.     $prefix = rtrim($prefix, '_'); 
  72.     $path  = str_replace('_', DIRECTORY_SEPARATOR, $prefix); 
  73.     self::getPluginLoader()->addPrefixPath($prefix, $path); 
  74.   } 
  75.   /** 
  76.    * addPath() - Add path to repositories where Action_Helpers could be found. 
  77.    * 
  78.    * @param string $path 
  79.    * @param string $prefix Optional; defaults to 'Zend_Controller_Action_Helper' 
  80.    * @return void 
  81.    */ 
  82.   static public function addPath($path, $prefix = 'Zend_Controller_Action_Helper') 
  83.   { 
  84.     self::getPluginLoader()->addPrefixPath($prefix, $path); 
  85.   } 
  86.   /** 
  87.    * addHelper() - Add helper objects 
  88.    * 
  89.    * @param Zend_Controller_Action_Helper_Abstract $helper 
  90.    * @return void 
  91.    */ 
  92.   static public function addHelper(Zend_Controller_Action_Helper_Abstract $helper) 
  93.   { 
  94.     self::getStack()->push($helper); 
  95.     return; 
  96.   } 
  97.   /** 
  98.    * resetHelpers() 
  99.    * 
  100.    * @return void 
  101.    */ 
  102.   static public function resetHelpers() 
  103.   { 
  104.     self::$_stack = null; 
  105.     return; 
  106.   } 
  107.   /** 
  108.    * Retrieve or initialize a helper statically 
  109.    * 
  110.    * Retrieves a helper object statically, loading on-demand if the helper 
  111.    * does not already exist in the stack. Always returns a helper, unless 
  112.    * the helper class cannot be found. 
  113.    * 
  114.    * @param string $name 
  115.    * @return Zend_Controller_Action_Helper_Abstract 
  116.    */ 
  117.   public static function getStaticHelper($name) 
  118.   { 
  119.     $name = self::_normalizeHelperName($name); 
  120.     $stack = self::getStack(); 
  121.     if (!isset($stack->{$name})) { 
  122.       self::_loadHelper($name); 
  123.     } 
  124.     return $stack->{$name}; 
  125.   } 
  126.   /** 
  127.    * getExistingHelper() - get helper by name 
  128.    * 
  129.    * Static method to retrieve helper object. Only retrieves helpers already 
  130.    * initialized with the broker (either via addHelper() or on-demand loading 
  131.    * via getHelper()). 
  132.    * 
  133.    * Throws an exception if the referenced helper does not exist in the 
  134.    * stack; use {@link hasHelper()} to check if the helper is registered 
  135.    * prior to retrieving it. 
  136.    * 
  137.    * @param string $name 
  138.    * @return Zend_Controller_Action_Helper_Abstract 
  139.    * @throws Zend_Controller_Action_Exception 
  140.    */ 
  141.   public static function getExistingHelper($name) 
  142.   { 
  143.     $name = self::_normalizeHelperName($name); 
  144.     $stack = self::getStack(); 
  145.     if (!isset($stack->{$name})) { 
  146.       require_once 'Zend/Controller/Action/Exception.php'; 
  147.       throw new Zend_Controller_Action_Exception('Action helper "' . $name . '" has not been registered with the helper broker'); 
  148.     } 
  149.     return $stack->{$name}; 
  150.   } 
  151.   /** 
  152.    * Return all registered helpers as helper => object pairs 
  153.    * 
  154.    * @return array 
  155.    */ 
  156.   public static function getExistingHelpers() 
  157.   { 
  158.     return self::getStack()->getHelpersByName(); 
  159.   } 
  160.   /** 
  161.    * Is a particular helper loaded in the broker? 
  162.    * 
  163.    * @param string $name 
  164.    * @return boolean 
  165.    */ 
  166.   public static function hasHelper($name) 
  167.   { 
  168.     $name = self::_normalizeHelperName($name); 
  169.     return isset(self::getStack()->{$name}); 
  170.   } 
  171.   /** 
  172.    * Remove a particular helper from the broker 
  173.    * 
  174.    * @param string $name 
  175.    * @return boolean 
  176.    */ 
  177.   public static function removeHelper($name) 
  178.   { 
  179.     $name = self::_normalizeHelperName($name); 
  180.     $stack = self::getStack(); 
  181.     if (isset($stack->{$name})) { 
  182.       unset($stack->{$name}); 
  183.     } 
  184.     return false; 
  185.   } 
  186.   /** 
  187.    * Lazy load the priority stack and return it 
  188.    * 
  189.    * @return Zend_Controller_Action_HelperBroker_PriorityStack 
  190.    */ 
  191.   public static function getStack() 
  192.   { 
  193.     if (self::$_stack == null) { 
  194.       self::$_stack = new Zend_Controller_Action_HelperBroker_PriorityStack(); 
  195.     } 
  196.     return self::$_stack; 
  197.   } 
  198.   /** 
  199.    * Constructor 
  200.    * 
  201.    * @param Zend_Controller_Action $actionController 
  202.    * @return void 
  203.    */ 
  204.   public function __construct(Zend_Controller_Action $actionController) 
  205.   { 
  206.     $this->_actionController = $actionController; 
  207.     foreach (self::getStack() as $helper) { 
  208.       $helper->setActionController($actionController); 
  209.       $helper->init(); 
  210.     } 
  211.   } 
  212.   /** 
  213.    * notifyPreDispatch() - called by action controller dispatch method 
  214.    * 
  215.    * @return void 
  216.    */ 
  217.   public function notifyPreDispatch() 
  218.   { 
  219.     foreach (self::getStack() as $helper) { 
  220.       $helper->preDispatch(); 
  221.     } 
  222.   } 
  223.   /** 
  224.    * notifyPostDispatch() - called by action controller dispatch method 
  225.    * 
  226.    * @return void 
  227.    */ 
  228.   public function notifyPostDispatch() 
  229.   { 
  230.     foreach (self::getStack() as $helper) { 
  231.       $helper->postDispatch(); 
  232.     } 
  233.   } 
  234.   /** 
  235.    * getHelper() - get helper by name 
  236.    * 
  237.    * @param string $name 
  238.    * @return Zend_Controller_Action_Helper_Abstract 
  239.    */ 
  240.   public function getHelper($name) 
  241.   { 
  242.     $name = self::_normalizeHelperName($name); 
  243.     $stack = self::getStack(); 
  244.     if (!isset($stack->{$name})) { 
  245.       self::_loadHelper($name); 
  246.     } 
  247.     $helper = $stack->{$name}; 
  248.     $initialize = false; 
  249.     if (null === ($actionController = $helper->getActionController())) { 
  250.       $initialize = true; 
  251.     } elseif ($actionController !== $this->_actionController) { 
  252.       $initialize = true; 
  253.     } 
  254.     if ($initialize) { 
  255.       $helper->setActionController($this->_actionController) 
  256.           ->init(); 
  257.     } 
  258.     return $helper; 
  259.   } 
  260.   /** 
  261.    * Method overloading 
  262.    * 
  263.    * @param string $method 
  264.    * @param array $args 
  265.    * @return mixed 
  266.    * @throws Zend_Controller_Action_Exception if helper does not have a direct() method 
  267.    */ 
  268.   public function __call($method, $args) 
  269.   { 
  270.     $helper = $this->getHelper($method); 
  271.     if (!method_exists($helper, 'direct')) { 
  272.       require_once 'Zend/Controller/Action/Exception.php'; 
  273.       throw new Zend_Controller_Action_Exception('Helper "' . $method . '" does not support overloading via direct()'); 
  274.     } 
  275.     return call_user_func_array(array($helper, 'direct'), $args); 
  276.   } 
  277.   /** 
  278.    * Retrieve helper by name as object property 
  279.    * 
  280.    * @param string $name 
  281.    * @return Zend_Controller_Action_Helper_Abstract 
  282.    */ 
  283.   public function __get($name) 
  284.   { 
  285.     return $this->getHelper($name); 
  286.   } 
  287.   /** 
  288.    * Normalize helper name for lookups 
  289.    * 
  290.    * @param string $name 
  291.    * @return string 
  292.    */ 
  293.   protected static function _normalizeHelperName($name) 
  294.   { 
  295.     if (strpos($name, '_') !== false) { 
  296.       $name = str_replace(' ', '', ucwords(str_replace('_', ' ', $name))); 
  297.     } 
  298.     return ucfirst($name); 
  299.   } 
  300.   /** 
  301.    * Load a helper 
  302.    * 
  303.    * @param string $name 
  304.    * @return void 
  305.    */ 
  306.   protected static function _loadHelper($name) 
  307.   { 
  308.     try { 
  309.       $class = self::getPluginLoader()->load($name); 
  310.     } catch (Zend_Loader_PluginLoader_Exception $e) { 
  311.       require_once 'Zend/Controller/Action/Exception.php'; 
  312.       throw new Zend_Controller_Action_Exception('Action Helper by name ' . $name . ' not found', 0, $e); 
  313.     } 
  314.     $helper = new $class(); 
  315.     if (!$helper instanceof Zend_Controller_Action_Helper_Abstract) { 
  316.       require_once 'Zend/Controller/Action/Exception.php'; 
  317.       throw new Zend_Controller_Action_Exception('Helper name ' . $name . ' -> class ' . $class . ' is not of type Zend_Controller_Action_Helper_Abstract'); 
  318.     } 
  319.     self::getStack()->push($helper); 
  320.   } 
  321. } 

助手经纪人的常见用法:

一、注册一个助手

1.Zend_Controller_Action_HelperBroker::addHelper($helper);

2.通过addPrefix()方法带有一个类前缀参数,用来加入自定义助手类的路径。

要求前缀遵循Zend Framework的类命名惯例。

// Add helpers prefixed with My_Action_Helpers in My/Action/Helpers/

Zend_Controller_Action_HelperBroker::addPrefix('My_Action_Helpers');

3.使用addPath()方法第一个参数为一个目录,第二个为类前缀(默认为'Zend_Controller_Action_Helper')。

用来将自己的类前缀映射到指定的目录。

// Add helpers prefixed with Helper in Plugins/Helpers/

Zend_Controller_Action_HelperBroker::addPath('./Plugins/Helpers','Helper');

二、判读助手是否存在

使用hasHelper($name)方法来判定助手经纪人中是否存在某助手,$name是助手的短名称(去掉前缀的):

  1. // Check if 'redirector' helper is registered with the broker: 
  2. if (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) { 
  3.   echo 'Redirector helper registered'; 
  4. } 

从助手经纪人中获取助手有两个静态方法:getExistingHelper() 和 getStaticHelper() ,getExistingHelper()将获取助手仅当它以前调用过或者显性地通过助手经纪人注册过,否则就抛出一个异常。getStaticHelper() 的做法和getExistingHelper()一样,但如果还没有注册助手堆栈,它将尝试初始化助手,为获取你要配置的的助手,getStaticHelper()是一个好的选择。

两个方法都带一个参数,$name,它是助手的短名称(去掉前缀)。

  1. // Check if 'redirector' helper is registered with the broker, and fetch: 
  2. if (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) { 
  3.   $redirector = 
  4.     Zend_Controller_Action_HelperBroker::getExistingHelper('redirector'); 
  5. } 
  6. // Or, simply retrieve it, not worrying about whether or not it was 
  7. // previously registered: 
  8. $redirector = 
  9.   Zend_Controller_Action_HelperBroker::getStaticHelper('redirector'); 
  10. } 

三、removeHelper($name)删除助手经纪人中的某个助手,$name是助手的短名称。

  1. // Conditionally remove the 'redirector' helper from the broker: 
  2. if (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) { 
  3.   Zend_Controller_Action_HelperBroker::removeHelper('redirector') 
  4. }

Tags: Framework Zend_Controller_Action_Helper

分享到: