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

助手经纪人的常见用法:

一、注册一个助手

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'

从助手经纪人中获取助手有两个静态方法: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. // Or, simply retrieve it, not worrying about whether or not it was 
  6. // previously registered: 
  7. $redirector = 
  8.   Zend_Controller_Action_HelperBroker::getStaticHelper('redirector'); 

三、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

分享到: