本文實(shí)例講述了Zend Framework動(dòng)作助手(Zend_Controller_Action_Helper)用法。分享給大家供大家參考,具體如下:
通過(guò)助手模式,可以把一些經(jīng)常使用的功能模塊做封裝,從而在可以在需要的地方靈活使用,主要是在action使用。
Zend Framework中有兩種助手,動(dòng)作助手(Zend_Controller_Action_Helper)和試圖助手(Zend_View_Helper)。
動(dòng)作助手可以向任何Zend_Controller_Action的衍生動(dòng)作控制器中,即時(shí)的加入功能(runtime and/or on-demand functionality),以使得增加公共的動(dòng)作控制器功能時(shí),盡量減少衍生動(dòng)作控制器類(lèi)的必要。
動(dòng)作助手在需要調(diào)用時(shí)加載,可以在請(qǐng)求的時(shí)候(bootstrap)或者動(dòng)作控制器創(chuàng)建的時(shí)候(init())實(shí)例化。
涉及到的相關(guān)文件
在/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
常見(jiàn)的動(dòng)作助手有:
FlashMessenger 用來(lái)處理Flash Messenger會(huì)話(huà);
Json 用來(lái)解碼和發(fā)送 JSON 響應(yīng);
Url 用于創(chuàng)建Urls;
Redirector 提供另一種實(shí)現(xiàn)方式,幫助程序重定向到內(nèi)部或者外部頁(yè)面;
ViewRenderer 自動(dòng)的完成在控制器內(nèi)建立視圖對(duì)象并渲染視圖的過(guò)程;
AutoComplete 自動(dòng)響應(yīng) AJAX 的自動(dòng)完成;
ContextSwitch 和 AjaxContext 為你的動(dòng)作提供替代響應(yīng)格式;
Cache 實(shí)現(xiàn)cache的相關(guān)操作;
ActionStack 用于操作動(dòng)作堆棧。
動(dòng)手的幾種實(shí)例化使用方式
1.通過(guò)Zend_Controller_Action的 $_helper成員的getHelper()方法。直接調(diào)用getHelper(),傳入助手的名稱(chēng)即可。
1
2
3
|
$redirector = $this ->_helper->getHelper( 'Redirector' ); //$redirector->getName(); $redirector ->gotoSimple( 'index2' ); |
2.直接通過(guò)訪(fǎng)問(wèn)的_helper助手的屬性對(duì)應(yīng)的助手對(duì)象。
1
|
$redirector = $this ->_helper->Redirector; |
Zend_Controller_Action_HelperBroker
中文名稱(chēng)譯作"助手經(jīng)紀(jì)人",顧名思義,是動(dòng)作助手的中間人。
在動(dòng)作的實(shí)例化使用的方式的第二種方式就是通過(guò)Zend_Controller_Action_HelperBroker的魔術(shù)方法__get()來(lái)實(shí)現(xiàn)的。
助手經(jīng)紀(jì)人用于注冊(cè)助手對(duì)象和助手路徑以及獲取助手等等功能。
Zend_Controller_Action_HelperBroker的實(shí)現(xiàn)以及常用方法列表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
|
<?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 ); } } |
助手經(jīng)紀(jì)人的常見(jiàn)用法:
一、注冊(cè)一個(gè)助手
1.
1
|
Zend_Controller_Action_HelperBroker::addHelper( $helper ); |
2.通過(guò)addPrefix()方法帶有一個(gè)類(lèi)前綴參數(shù),用來(lái)加入自定義助手類(lèi)的路徑。
要求前綴遵循Zend Framework的類(lèi)命名慣例。
1
2
|
// Add helpers prefixed with My_Action_Helpers in My/Action/Helpers/ Zend_Controller_Action_HelperBroker::addPrefix( 'My_Action_Helpers' ); |
3.使用addPath()方法第一個(gè)參數(shù)為一個(gè)目錄,第二個(gè)為類(lèi)前綴(默認(rèn)為'Zend_Controller_Action_Helper')。
用來(lái)將自己的類(lèi)前綴映射到指定的目錄。
1
2
3
|
// Add helpers prefixed with Helper in Plugins/Helpers/ Zend_Controller_Action_HelperBroker::addPath( './Plugins/Helpers' , 'Helper' ); |
二、判讀助手是否存在
使用hasHelper($name)方法來(lái)判定助手經(jīng)紀(jì)人中是否存在某助手,$name是助手的短名稱(chēng)(去掉前綴的):
1
2
3
4
|
// Check if 'redirector' helper is registered with the broker: if (Zend_Controller_Action_HelperBroker::hasHelper( 'redirector' )) { echo 'Redirector helper registered' ; } |
從助手經(jīng)紀(jì)人中獲取助手有兩個(gè)靜態(tài)方法:getExistingHelper() 和 getStaticHelper() 。getExistingHelper()將獲取助手僅當(dāng)它以前調(diào)用過(guò)或者顯性地通過(guò)助手經(jīng)紀(jì)人注冊(cè)過(guò),否則就拋出一個(gè)異常。getStaticHelper() 的做法和getExistingHelper()一樣,但如果還沒(méi)有注冊(cè)助手堆棧,它將嘗試初始化助手,為獲取你要配置的的助手,getStaticHelper()是一個(gè)好的選擇。
兩個(gè)方法都帶一個(gè)參數(shù),$name,它是助手的短名稱(chēng)(去掉前綴)。
1
2
3
4
5
6
7
8
9
10
|
// 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)刪除助手經(jīng)紀(jì)人中的某個(gè)助手,$name是助手的短名稱(chēng)。
1
2
3
4
|
// Conditionally remove the 'redirector' helper from the broker: if (Zend_Controller_Action_HelperBroker::hasHelper( 'redirector' )) { Zend_Controller_Action_HelperBroker::removeHelper( 'redirector' ) } |
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。