Zend_Controller-Dispatcher.xml 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Reviewed: no -->
  3. <!-- EN-Revision: 15103 -->
  4. <sect1 id="zend.controller.dispatcher">
  5. <title>ディスパッチャ</title>
  6. <sect2 id="zend.controller.dispatcher.overview">
  7. <title>概要</title>
  8. <para>
  9. ディスパッチ処理は、リクエストオブジェクトである
  10. <classname>Zend_Controller_Request_Abstract</classname> を受け取り、
  11. そこに含まれる情報 (モジュール名、コントローラ名、アクション名およびオプションのパラメータ)
  12. を展開し、コントローラのインスタンスを作成してそのコントローラのアクションをコールします。
  13. モジュールやコントローラ、アクションが見つからない場合は、
  14. デフォルト値を使用します。<classname>Zend_Controller_Dispatcher_Standard</classname>
  15. では、コントローラとアクションのデフォルトはどちらも
  16. <code>index</code> で、モジュールのデフォルトは <code>default</code> です。しかし、
  17. <code>setDefaultController()</code> メソッドや
  18. <code>setDefaultAction()</code> メソッド、そして
  19. <code>setDefaultModule()</code> でこれらを変更することもできます。
  20. </para>
  21. <note>
  22. <title>デフォルトモジュール</title>
  23. <para>
  24. モジュール構造のアプリケーションを作成する場合に、
  25. デフォルトのモジュールにも名前空間を定義したくなることもあるでしょう
  26. (デフォルトの設定では、デフォルトモジュールには名前空間が
  27. <emphasis>ありません</emphasis>)。1.5.0 以降では、
  28. フロントコントローラあるいはディスパッチャで
  29. <code>prefixDefaultModule</code> に true
  30. を設定すればこれが実現できるようになりました。
  31. </para>
  32. <programlisting role="php"><![CDATA[
  33. // フロントコントローラで
  34. $front->setParam('prefixDefaultModule', true);
  35. // ディスパッチャで
  36. $dispatcher->setParam('prefixDefaultModule', true);
  37. ]]>
  38. </programlisting>
  39. <para>
  40. これにより、既存のモジュールをアプリケーションのデフォルトモジュールとすることができます。
  41. </para>
  42. </note>
  43. <para>
  44. ディスパッチ処理が発生するのは、フロントコントローラでのループの内部です。
  45. ディスパッチ処理を行う前に、フロントコントローラはルーティングを行い、
  46. ユーザが指定したコントローラとアクション、そして追加のパラメータを取得します。
  47. それからディスパッチループに入り、リクエストを配送します。
  48. </para>
  49. <para>
  50. ループ内では、まず最初にリクエストオブジェクトのフラグを設定します。
  51. このフラグは、アクションがディスパッチされたことを示すものです。
  52. アクション内や pre/postDispatch プラグインでこのフラグをリセットすると、
  53. ディスパッチループがそのまま継続され、もう一度リクエストを処理しようとします。
  54. リクエスト内のコントローラやアクションを変更してフラグをリセットすることで、
  55. さまざまなリクエストを続けて実行させることができます。
  56. </para>
  57. <para>
  58. このようなディスパッチ処理を制御する
  59. アクションコントローラのメソッドが <code>_forward()</code> です。
  60. このメソッドを pre/postDispatch() やアクションメソッドでコールし、
  61. コントローラやアクション、
  62. そして新しいアクションに送りたい追加のパラメータを指定します。
  63. </para>
  64. <programlisting role="php"><![CDATA[
  65. public function fooAction()
  66. {
  67. // 現在のモジュールおよびコントローラの、別のアクションに転送します
  68. $this->_forward('bar', null, null, array('baz' => 'bogus'));
  69. }
  70. public function barAction()
  71. {
  72. // 現在のモジュールにある、別のコントローラのアクション
  73. // FooController::bazAction() に転送します
  74. $this->_forward('baz', 'foo', null, array('baz' => 'bogus'));
  75. }
  76. public function bazAction()
  77. {
  78. // 別のモジュールにある、別のコントローラのアクション
  79. // Foo_BarController::bazAction() に転送します
  80. $this->_forward('baz', 'bar', 'foo', array('baz' => 'bogus'));
  81. }
  82. ]]>
  83. </programlisting>
  84. </sect2>
  85. <sect2 id="zend.controller.dispatcher.subclassing">
  86. <title>ディスパッチャのサブクラスの作成</title>
  87. <para>
  88. <classname>Zend_Controller_Front</classname> は、
  89. まず最初にルータをコールして、
  90. リクエスト内で最初にディスパッチできるアクションを決定します。
  91. その後、ディスパッチャループに入り、ディスパッチャをコールしてアクションを振り分けます。
  92. </para>
  93. <para>
  94. ディスパッチャが動作するためには、さまざまなデータが必要です。
  95. たとえば、コントローラ名やアクション名を決定する方法、
  96. コントローラクラスを探す場所、モジュール名が有効かどうか、
  97. その他、リクエストの内容をディスパッチするために必要な情報を取得する
  98. API が必要となります。
  99. </para>
  100. <para>
  101. <classname>Zend_Controller_Dispatcher_Interface</classname>
  102. では次のようなメソッドを定義しています。ディスパッチャは、これを実装しなければなりません。
  103. </para>
  104. <programlisting role="php"><![CDATA[
  105. interface Zend_Controller_Dispatcher_Interface
  106. {
  107. /**
  108. * Format a string into a controller class name.
  109. *
  110. * @param string $unformatted
  111. * @return string
  112. */
  113. public function formatControllerName($unformatted);
  114. /**
  115. * Format a string into an action method name.
  116. *
  117. * @param string $unformatted
  118. * @return string
  119. */
  120. public function formatActionName($unformatted);
  121. /**
  122. * Determine if a request is dispatchable
  123. *
  124. * @param Zend_Controller_Request_Abstract $request
  125. * @return boolean
  126. */
  127. public function isDispatchable(
  128. Zend_Controller_Request_Abstract $request
  129. );
  130. /**
  131. * Set a user parameter (via front controller, or for local use)
  132. *
  133. * @param string $name
  134. * @param mixed $value
  135. * @return Zend_Controller_Dispatcher_Interface
  136. */
  137. public function setParam($name, $value);
  138. /**
  139. * Set an array of user parameters
  140. *
  141. * @param array $params
  142. * @return Zend_Controller_Dispatcher_Interface
  143. */
  144. public function setParams(array $params);
  145. /**
  146. * Retrieve a single user parameter
  147. *
  148. * @param string $name
  149. * @return mixed
  150. */
  151. public function getParam($name);
  152. /**
  153. * Retrieve all user parameters
  154. *
  155. * @return array
  156. */
  157. public function getParams();
  158. /**
  159. * Clear the user parameter stack, or a single user parameter
  160. *
  161. * @param null|string|array single key or array of keys for
  162. * params to clear
  163. * @return Zend_Controller_Dispatcher_Interface
  164. */
  165. public function clearParams($name = null);
  166. /**
  167. * Set the response object to use, if any
  168. *
  169. * @param Zend_Controller_Response_Abstract|null $response
  170. * @return void
  171. */
  172. public function setResponse(
  173. Zend_Controller_Response_Abstract $response = null
  174. );
  175. /**
  176. * Retrieve the response object, if any
  177. *
  178. * @return Zend_Controller_Response_Abstract|null
  179. */
  180. public function getResponse();
  181. /**
  182. * Add a controller directory to the controller directory stack
  183. *
  184. * @param string $path
  185. * @param string $args
  186. * @return Zend_Controller_Dispatcher_Interface
  187. */
  188. public function addControllerDirectory($path, $args = null);
  189. /**
  190. * Set the directory (or directories) where controller files are
  191. * stored
  192. *
  193. * @param string|array $dir
  194. * @return Zend_Controller_Dispatcher_Interface
  195. */
  196. public function setControllerDirectory($path);
  197. /**
  198. * Return the currently set directory(ies) for controller file
  199. * lookup
  200. *
  201. * @return array
  202. */
  203. public function getControllerDirectory();
  204. /**
  205. * Dispatch a request to a (module/)controller/action.
  206. *
  207. * @param Zend_Controller_Request_Abstract $request
  208. * @param Zend_Controller_Response_Abstract $response
  209. * @return Zend_Controller_Request_Abstract|boolean
  210. */
  211. public function dispatch(
  212. Zend_Controller_Request_Abstract $request,
  213. Zend_Controller_Response_Abstract $response
  214. );
  215. /**
  216. * Whether or not a given module is valid
  217. *
  218. * @param string $module
  219. * @return boolean
  220. */
  221. public function isValidModule($module);
  222. /**
  223. * Retrieve the default module name
  224. *
  225. * @return string
  226. */
  227. public function getDefaultModule();
  228. /**
  229. * Retrieve the default controller name
  230. *
  231. * @return string
  232. */
  233. public function getDefaultControllerName();
  234. /**
  235. * Retrieve the default action
  236. *
  237. * @return string
  238. */
  239. public function getDefaultAction();
  240. }
  241. ]]>
  242. </programlisting>
  243. <para>
  244. しかし、たいていの場合は単純に抽象クラス
  245. <classname>Zend_Controller_Dispatcher_Abstract</classname>
  246. を継承するだけで事足りるでしょう。ここには、これらのメソッドがすでに定義されています。
  247. あるいは、<classname>Zend_Controller_Dispatcher_Standard</classname>
  248. を継承して、標準の機能と異なる部分だけを変更するということも可能です。
  249. </para>
  250. <para>
  251. ディスパッチャのサブクラスを作成する必要がある場面としては、
  252. たとえばアクションコントローラ内で
  253. 標準とは異なるクラス名やメソッド名の命名規則を使用したいなどということが考えられます。
  254. あるいは、クラスメソッドに振り分けるのではなく
  255. コントローラディレクトリは以下のアクションファイルに振り分けるなど、
  256. 異なるディスパッチ方式を使用したい場合にもサブクラスを作成する必要があります。
  257. </para>
  258. </sect2>
  259. </sect1>
  260. <!--
  261. vim:se ts=4 sw=4 et:
  262. -->