动作助手 介绍 动作助手可以向任何Zend_Controller_Action的衍生动作控制器中,即时的加入功能(runtime and/or on-demand functionality),以使得增加公共的动作控制器功能时,尽量减少衍生动作控制器类的必要。 动作助手有多种使用方式。动作助手使用了一套经纪系统(brokerage system),与Zend_View_Helper中使用的,也就是Zend_Controller_Plugin的经纪系统类似。动作助手(like Zend_View_Helper)在需要调用时加载,可以在请求的时候(bootstrap)或者动作控制器创建的时候(init())实例化。要充分了解这些细节,请阅读下面的章节。 初始化助手 根据需求以及助手的功能,可有几种不同的初始化方式。 助手经纪人(broker)存储在Zend_Controller_Action$_helper成员中,可以使用经纪人来获取或者调用助手。以下是操作方法: 显式的调用getHelper()方法。简单的传入助手名字,就可以返回助手对象。 _helper->getHelper('FlashMessenger'); $flashMessenger->addMessage('We did something in the last request'); ]]> 使用助手经纪人的__get()方法,就像获取经纪人的成员属性一样获取助手。 _helper->FlashMessenger; $flashMessenger->addMessage('We did something in the last request'); ]]> 最后,大部分动作助手实现了direct()方法,它将调用助手的一个特定的,默认的方法。以FlashMessenger为例,它调用了方法addMessage() _helper->FlashMessenger('We did something in the last request'); ]]> 上面的例子在功能上是等价的。 也可以显式的实例化助手。如果你要在动作控制器之外使用助手,或者给助手经纪人传入一个助手供所有的动作使用,你可能希望直接这么做。实例化助手和实例化其他PHP类的方法一样。 助手经纪人 Zend_Controller_Action_HelperBroker处理注册助手对象和助手路径,即时的获取助手等细节。 使用addHelper来注册助手: 实例化助手并传入经纪人有点耗费时间和资源,不过addPrefix()addPath()两个方法能够很容易的自动完成这些工作: addPrefix()方法带有一个类前缀参数,用来加入自定义助手类的路径。它假定前缀遵循Zend Framework的类命名惯例。 addPath()方法第一个参数为一个目录,第二个为类前缀(默认为'Zend_Controller_Action_Helper')。用来将自己的类前缀映射到指定的目录。 这些方法是静态的,因而可以根据需要在控制器链中的任何位置调用动态的加载助手。 使用hasHelper($name)方法来判定助手经纪人中是否存在某助手,$name是助手的短名称(去掉前缀的): 从助手经纪人中获取助手有两个静态方法:getExistingHelper()getStaticHelper()getExistingHelper()将获取助手仅当它以前调用过或者显性地通过助手经纪人注册过,否则就抛出一个异常。getStaticHelper() 的做法和getExistingHelper()一样,但如果还没有注册助手堆栈,它将尝试初始化助手,为获取你要配置的的助手,getStaticHelper()是一个好的选择。 两个方法都带一个参数,$name,它是助手的短名称(去掉前缀)。 最后,使用removeHelper($name)来删除助手经纪人中的某个助手,$name是助手的短名称。 内建的动作助手 Zend Framework 默认包含若干个动作助手:AutoComplete 自动响应 AJAX 的自动完成;ContextSwitchAjaxContext 为你的动作提供替代响应格式;FlashMessenger 用来处理Flash Messenger会话;Json 用来解码和发送 JSON 响应;Redirector 提供另一种实现方式,帮助程序重定向到内部或者外部页面;ViewRenderer 自动的完成在控制器内建立视图对象并渲染视图的过程。 编写自己的助手 动作助手继承抽象类Zend_Controller_Action_Helper_Abstract,该类提供了助手经纪人要求的基本接口和功能,包含下列方法: setActionController() 用来设置当前的动作控制器。 init(),该方法在实例化时由助手经纪人触发,可用来触发助手的初始化过程;动作链中多个控制器使用相同的助手时,如要恢复状态时将十分有用。 preDispatch()分发动作之前触发。 postDispatch()分发过程结束时触发——即使preDispatch()插件已经跳过了该动作。清理时大量使用。 getRequest() 获取当前的请求对象。 getResponse() 获取当前的响应对象。 getName() 获取助手名。获取了下划线后面的类名部分,没有下划线则获取类的全名。例如,如果类名为Zend_Controller_Action_Helper_Redirector,他将返回 Redirector,如果类名为FooMessage,将会返回全名。 助手类中还可以包含一个direct()方法,如果定义了该方法,就可以将助手视作助手经纪人的一个方法,以便简单的、一次性的使用助手。例如redirector 定义direct() 作为goto()的别名,就可以这样使用: _helper->redirector('item', 'view', 'blog', array('id' => 42)); ]]> 在内部,助手经纪人的__call()方法先寻找名叫redirector的助手,然后检查该助手的direct方法是否定义,然后使用所提供的参数来调用该方法。 如果创建了自己的助手,可以按照前面章节所述的提供相应的访问方法。