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


Posted in PHP onMarch 05, 2016

本文实例讲述了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/中

│  Exception.php
│  HelperBroker.php
│  Interface.php

├─Helper
│  │  Abstract.php
│  │  ActionStack.php
│  │  AjaxContext.php
│  │  AutoCompleteDojo.php
│  │  AutoCompleteScriptaculous.php
│  │  Cache.php
│  │  ContextSwitch.php
│  │  FlashMessenger.php
│  │  Json.php
│  │  Redirector.php
│  │  Url.php
│  │  ViewRenderer.php
│  │
│  └─AutoComplete
│          Abstract.php

└─HelperBroker
       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(),传入助手的名称即可。

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

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

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

Zend_Controller_Action_HelperBroker

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

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

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

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

<?php
/**
 * @see Zend_Controller_Action_HelperBroker_PriorityStack
 */
require_once 'Zend/Controller/Action/HelperBroker/PriorityStack.php';
/**
 * @see Zend_Loader
 */
require_once 'Zend/Loader.php';
/**
 * @category  Zend
 * @package  Zend_Controller
 * @subpackage Zend_Controller_Action
 * @copyright Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
 * @license  http://framework.zend.com/license/new-bsd   New BSD License
 */
class Zend_Controller_Action_HelperBroker
{
  /**
   * $_actionController - ActionController reference
   *
   * @var Zend_Controller_Action
   */
  protected $_actionController;
  /**
   * @var Zend_Loader_PluginLoader_Interface
   */
  protected static $_pluginLoader;
  /**
   * $_helpers - Helper array
   *
   * @var Zend_Controller_Action_HelperBroker_PriorityStack
   */
  protected static $_stack = null;
  /**
   * Set PluginLoader for use with broker
   *
   * @param Zend_Loader_PluginLoader_Interface $loader
   * @return void
   */
  public static function setPluginLoader($loader)
  {
    if ((null !== $loader) && (!$loader instanceof Zend_Loader_PluginLoader_Interface)) {
      require_once 'Zend/Controller/Action/Exception.php';
      throw new Zend_Controller_Action_Exception('Invalid plugin loader provided to HelperBroker');
    }
    self::$_pluginLoader = $loader;
  }
  /**
   * Retrieve PluginLoader
   *
   * @return Zend_Loader_PluginLoader
   */
  public static function getPluginLoader()
  {
    if (null === self::$_pluginLoader) {
      require_once 'Zend/Loader/PluginLoader.php';
      self::$_pluginLoader = new Zend_Loader_PluginLoader(array(
        'Zend_Controller_Action_Helper' => 'Zend/Controller/Action/Helper/',
      ));
    }
    return self::$_pluginLoader;
  }
  /**
   * addPrefix() - Add repository of helpers by prefix
   *
   * @param string $prefix
   */
  static public function addPrefix($prefix)
  {
    $prefix = rtrim($prefix, '_');
    $path  = str_replace('_', DIRECTORY_SEPARATOR, $prefix);
    self::getPluginLoader()->addPrefixPath($prefix, $path);
  }
  /**
   * addPath() - Add path to repositories where Action_Helpers could be found.
   *
   * @param string $path
   * @param string $prefix Optional; defaults to 'Zend_Controller_Action_Helper'
   * @return void
   */
  static public function addPath($path, $prefix = 'Zend_Controller_Action_Helper')
  {
    self::getPluginLoader()->addPrefixPath($prefix, $path);
  }
  /**
   * addHelper() - Add helper objects
   *
   * @param Zend_Controller_Action_Helper_Abstract $helper
   * @return void
   */
  static public function addHelper(Zend_Controller_Action_Helper_Abstract $helper)
  {
    self::getStack()->push($helper);
    return;
  }
  /**
   * resetHelpers()
   *
   * @return void
   */
  static public function resetHelpers()
  {
    self::$_stack = null;
    return;
  }
  /**
   * Retrieve or initialize a helper statically
   *
   * Retrieves a helper object statically, loading on-demand if the helper
   * does not already exist in the stack. Always returns a helper, unless
   * the helper class cannot be found.
   *
   * @param string $name
   * @return Zend_Controller_Action_Helper_Abstract
   */
  public static function getStaticHelper($name)
  {
    $name = self::_normalizeHelperName($name);
    $stack = self::getStack();
    if (!isset($stack->{$name})) {
      self::_loadHelper($name);
    }
    return $stack->{$name};
  }
  /**
   * getExistingHelper() - get helper by name
   *
   * Static method to retrieve helper object. Only retrieves helpers already
   * initialized with the broker (either via addHelper() or on-demand loading
   * via getHelper()).
   *
   * Throws an exception if the referenced helper does not exist in the
   * stack; use {@link hasHelper()} to check if the helper is registered
   * prior to retrieving it.
   *
   * @param string $name
   * @return Zend_Controller_Action_Helper_Abstract
   * @throws Zend_Controller_Action_Exception
   */
  public static function getExistingHelper($name)
  {
    $name = self::_normalizeHelperName($name);
    $stack = self::getStack();
    if (!isset($stack->{$name})) {
      require_once 'Zend/Controller/Action/Exception.php';
      throw new Zend_Controller_Action_Exception('Action helper "' . $name . '" has not been registered with the helper broker');
    }
    return $stack->{$name};
  }
  /**
   * Return all registered helpers as helper => object pairs
   *
   * @return array
   */
  public static function getExistingHelpers()
  {
    return self::getStack()->getHelpersByName();
  }
  /**
   * Is a particular helper loaded in the broker?
   *
   * @param string $name
   * @return boolean
   */
  public static function hasHelper($name)
  {
    $name = self::_normalizeHelperName($name);
    return isset(self::getStack()->{$name});
  }
  /**
   * Remove a particular helper from the broker
   *
   * @param string $name
   * @return boolean
   */
  public static function removeHelper($name)
  {
    $name = self::_normalizeHelperName($name);
    $stack = self::getStack();
    if (isset($stack->{$name})) {
      unset($stack->{$name});
    }
    return false;
  }
  /**
   * Lazy load the priority stack and return it
   *
   * @return Zend_Controller_Action_HelperBroker_PriorityStack
   */
  public static function getStack()
  {
    if (self::$_stack == null) {
      self::$_stack = new Zend_Controller_Action_HelperBroker_PriorityStack();
    }
    return self::$_stack;
  }
  /**
   * Constructor
   *
   * @param Zend_Controller_Action $actionController
   * @return void
   */
  public function __construct(Zend_Controller_Action $actionController)
  {
    $this->_actionController = $actionController;
    foreach (self::getStack() as $helper) {
      $helper->setActionController($actionController);
      $helper->init();
    }
  }
  /**
   * notifyPreDispatch() - called by action controller dispatch method
   *
   * @return void
   */
  public function notifyPreDispatch()
  {
    foreach (self::getStack() as $helper) {
      $helper->preDispatch();
    }
  }
  /**
   * notifyPostDispatch() - called by action controller dispatch method
   *
   * @return void
   */
  public function notifyPostDispatch()
  {
    foreach (self::getStack() as $helper) {
      $helper->postDispatch();
    }
  }
  /**
   * getHelper() - get helper by name
   *
   * @param string $name
   * @return Zend_Controller_Action_Helper_Abstract
   */
  public function getHelper($name)
  {
    $name = self::_normalizeHelperName($name);
    $stack = self::getStack();
    if (!isset($stack->{$name})) {
      self::_loadHelper($name);
    }
    $helper = $stack->{$name};
    $initialize = false;
    if (null === ($actionController = $helper->getActionController())) {
      $initialize = true;
    } elseif ($actionController !== $this->_actionController) {
      $initialize = true;
    }
    if ($initialize) {
      $helper->setActionController($this->_actionController)
          ->init();
    }
    return $helper;
  }
  /**
   * Method overloading
   *
   * @param string $method
   * @param array $args
   * @return mixed
   * @throws Zend_Controller_Action_Exception if helper does not have a direct() method
   */
  public function __call($method, $args)
  {
    $helper = $this->getHelper($method);
    if (!method_exists($helper, 'direct')) {
      require_once 'Zend/Controller/Action/Exception.php';
      throw new Zend_Controller_Action_Exception('Helper "' . $method . '" does not support overloading via direct()');
    }
    return call_user_func_array(array($helper, 'direct'), $args);
  }
  /**
   * Retrieve helper by name as object property
   *
   * @param string $name
   * @return Zend_Controller_Action_Helper_Abstract
   */
  public function __get($name)
  {
    return $this->getHelper($name);
  }
  /**
   * Normalize helper name for lookups
   *
   * @param string $name
   * @return string
   */
  protected static function _normalizeHelperName($name)
  {
    if (strpos($name, '_') !== false) {
      $name = str_replace(' ', '', ucwords(str_replace('_', ' ', $name)));
    }
    return ucfirst($name);
  }
  /**
   * Load a helper
   *
   * @param string $name
   * @return void
   */
  protected static function _loadHelper($name)
  {
    try {
      $class = self::getPluginLoader()->load($name);
    } catch (Zend_Loader_PluginLoader_Exception $e) {
      require_once 'Zend/Controller/Action/Exception.php';
      throw new Zend_Controller_Action_Exception('Action Helper by name ' . $name . ' not found', 0, $e);
    }
    $helper = new $class();
    if (!$helper instanceof Zend_Controller_Action_Helper_Abstract) {
      require_once 'Zend/Controller/Action/Exception.php';
      throw new Zend_Controller_Action_Exception('Helper name ' . $name . ' -> class ' . $class . ' is not of type Zend_Controller_Action_Helper_Abstract');
    }
    self::getStack()->push($helper);
  }
}

助手经纪人的常见用法:

一、注册一个助手

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是助手的短名称(去掉前缀的):

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

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

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

// Check if 'redirector' helper is registered with the broker, and fetch:
if (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) {
  $redirector =
    Zend_Controller_Action_HelperBroker::getExistingHelper('redirector');
}
// Or, simply retrieve it, not worrying about whether or not it was
// previously registered:
$redirector =
  Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
}

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

// Conditionally remove the 'redirector' helper from the broker:
if (Zend_Controller_Action_HelperBroker::hasHelper('redirector')) {
  Zend_Controller_Action_HelperBroker::removeHelper('redirector')
}

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
MayFish PHP的MVC架构的开发框架
Aug 13 PHP
php表单提交问题的解决方法
Apr 12 PHP
深入php define()函数以及defined()函数的用法详解
Jun 05 PHP
PHP中shuffle数组值随便排序函数用法
Nov 21 PHP
php简单实现数组分页的方法
Apr 30 PHP
php获取服务器操作系统相关信息的方法
Oct 08 PHP
php页面跳转session cookie丢失导致不能登录等问题的解决方法
Dec 12 PHP
替换php字符串中的单引号为双引号的方法
Feb 16 PHP
php使用PDO从数据库表中读取数据的实现方法(必看)
Jun 02 PHP
PHP 记录访客的浏览信息方法
Jan 29 PHP
Laravel访问出错提示:`Warning: require(/vendor/autoload.php): failed to open stream: No such file or di解决方法
Apr 02 PHP
PHP加MySQL消息队列深入理解
Feb 27 PHP
Zend Framework实现Zend_View集成Smarty模板系统的方法
Mar 05 #PHP
Zend Framework教程之视图组件Zend_View用法详解
Mar 05 #PHP
Zend Framework教程之模型Model用法简单实例
Mar 04 #PHP
基于PHP实现等比压缩图片大小
Mar 04 #PHP
Zend Framework教程之模型Model基本规则和使用方法
Mar 04 #PHP
Zend Framework教程之Zend_Layout布局助手详解
Mar 04 #PHP
php mailer类调用远程SMTP服务器发送邮件实现方法
Mar 04 #PHP
You might like
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
PHPExcel实现的读取多工作表操作示例
2020/04/14 PHP
再谈ie和firefox下的document.all属性
2009/10/21 Javascript
让IE8支持DOM 2(不用框架!)
2009/12/31 Javascript
JSQL 基于客户端的成绩统计实现方法
2010/05/05 Javascript
jquery submit ie6下失效的原因分析及解决方法
2013/11/15 Javascript
jQuery结合ajax实现动态加载文本内容
2015/05/19 Javascript
JavaScript中setUTCMilliseconds()方法的使用详解
2015/06/12 Javascript
jquery自定义表格样式
2015/11/23 Javascript
Bootstrap Table服务器分页与在线编辑应用总结
2016/08/08 Javascript
javascript中活灵活现的Array对象详解
2016/11/30 Javascript
基于BootStrap与jQuery.validate实现表单提交校验功能
2016/12/22 Javascript
Linux使用Node.js建立访问静态网页的服务实例详解
2017/03/21 Javascript
jQuery返回定位插件详解
2017/05/15 jQuery
react系列从零开始_简单谈谈react
2017/07/06 Javascript
详解AngularJS跨页面传值(ui-router)
2017/08/23 Javascript
jQuery使用bind函数实现绑定多个事件的方法
2017/10/11 jQuery
微信小程序事件 bindtap bindinput代码实例
2019/08/26 Javascript
[15:20]DOTA2-DPC中国联赛 正赛 Elephant vs Aster 选手采访
2021/03/11 DOTA
Python实现的监测服务器硬盘使用率脚本分享
2014/11/07 Python
在Python的Flask框架中实现全文搜索功能
2015/04/20 Python
python解析html提取数据,并生成word文档实例解析
2018/01/22 Python
python去除拼音声调字母,替换为字母的方法
2018/11/28 Python
python实现图书借阅系统
2019/02/20 Python
python opencv 读取图片 返回图片某像素点的b,g,r值的实现方法
2019/07/03 Python
Python中低维数组填充高维数组的实现
2019/12/02 Python
python2.7使用scapy发送syn实例
2020/05/05 Python
CSS3 函数技巧 用css 实现js实现的事情(clac Counters Tooltip)
2017/08/15 HTML / CSS
Envie de Fraise意大利:法国网上推出的孕妇装品牌
2020/10/18 全球购物
为什么要使用servlet
2016/01/17 面试题
日语翻译个人求职的自我评价
2013/10/14 职场文书
大学生村官承诺书
2014/03/28 职场文书
村干部培训方案
2014/05/02 职场文书
导游词之山西祁县乔家大院
2019/10/14 职场文书
详解Redis瘦身指南
2021/05/26 Redis
高性能跳频抗干扰宽带自组网电台
2022/02/18 无线电