Zend_Controller-Migration.xml 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Reviewed: no -->
  3. <!-- EN-Revision: 17171 -->
  4. <sect1 id="zend.controller.migration">
  5. <title>以前のバージョンからの移行</title>
  6. <para>
  7. <acronym>MVC</acronym> コンポーネントの <acronym>API</acronym> は以前とは変更されました。
  8. 初期のバージョンから Zend Framework を使用しておられるかたは、
  9. 以下のガイドラインにしたがってスクリプトを変更し、
  10. 新しい仕組みに対応させてください。
  11. </para>
  12. <sect2 id="zend.controller.migration.fromoneseventooneeight">
  13. <title>1.7.x から 1.8.0 以降への移行</title>
  14. <sect3 id="zend.controller.migration.fromoneseventooneeight.router">
  15. <title>標準のルートの変更</title>
  16. <para>
  17. 新しい標準ルートでは翻訳セグメントが使用できるようになったため、
  18. ルートのセグメントの先頭にある '<emphasis>@</emphasis>'
  19. は特殊文字と解釈されるようになりました。
  20. この文字を静的セグメント内で使用するには、前にもうひとつ
  21. '<emphasis>@</emphasis>' をつけてエスケープする必要があります。
  22. また、'<emphasis>:</emphasis>' も同様です。
  23. </para>
  24. </sect3>
  25. </sect2>
  26. <sect2 id="zend.controller.migration.fromonesixtooneseven">
  27. <title>1.6.x から 1.7.0 以降への移行</title>
  28. <sect3 id="zend.controller.migration.fromonesixtooneseven.dispatcher">
  29. <title>ディスパッチャインターフェイスの変更</title>
  30. <para>
  31. ユーザからの指摘により、
  32. <classname>Zend_Controller_Action_Helper_ViewRenderer</classname>
  33. が使っているディスパッチャ抽象クラスのメソッドの中で
  34. ディスパッチャインターフェイスに存在しないものがあることに気づきました。
  35. 次のメソッドを追加し、
  36. 自作のディスパッチャが同梱の実装と共存できるようにしています。
  37. </para>
  38. <itemizedlist>
  39. <listitem><para>
  40. <methodname>formatModuleName()</methodname>:
  41. リクエストオブジェクト内に格納されたりしている生のコントローラ名を受け取り、
  42. それを再フォーマットして
  43. <classname>Zend_Controller_Action</classname> を継承した適切なクラス名にします。
  44. </para></listitem>
  45. </itemizedlist>
  46. </sect3>
  47. </sect2>
  48. <sect2 id="zend.controller.migration.fromoneohtoonesix">
  49. <title>1.5.x から 1.6.0 以降への移行</title>
  50. <sect3 id="zend.controller.migration.fromoneohtoonesix.dispatcher">
  51. <title>ディスパッチャインターフェイスの変更</title>
  52. <para>
  53. <classname>Zend_Controller_Front</classname> と
  54. <classname>Zend_Controller_Router_Route_Module</classname>
  55. は、ディスパッチャインターフェイスにないメソッドを使用していました。
  56. 次の 3 つのメソッドを追加し、
  57. 自作のディスパッチャが同梱の実装と共存できるようにしています。
  58. </para>
  59. <itemizedlist>
  60. <listitem><para>
  61. <methodname>getDefaultModule()</methodname>:
  62. デフォルトモジュールの名前を返します。
  63. </para></listitem>
  64. <listitem><para>
  65. <methodname>getDefaultControllerName()</methodname>:
  66. デフォルトコントローラの名前を返します。
  67. </para></listitem>
  68. <listitem><para>
  69. <methodname>getDefaultAction()</methodname>:
  70. デフォルトアクションの名前を返します。
  71. </para></listitem>
  72. </itemizedlist>
  73. </sect3>
  74. </sect2>
  75. <sect2 id="zend.controller.migration.fromoneohtoonefive">
  76. <title>1.0.x から 1.5.0 以降への移行</title>
  77. <para>
  78. 基本的な機能は同じでドキュメント化されている機能も変わりませんが、
  79. ひとつだけ、<emphasis>ドキュメント化されていない</emphasis>
  80. "機能" が変更されました。
  81. </para>
  82. <para>
  83. <acronym>URL</acronym> の書き方としてドキュメント化されている方法は、
  84. camelCased 形式の名前のアクションを使用するために
  85. 単語の区切り文字を使用するというものです。デフォルトの区切り文字は
  86. '.' あるいは '-' ですが、ディスパッチャの設定で変更することができます。
  87. ディスパッチャは内部でアクション名を小文字に変換し、
  88. 単語の区切り文字をもとに camelCasing 形式のアクションメソッド名を作成します。
  89. しかし、<acronym>PHP</acronym> の関数名は大文字小文字を区別しないので、<acronym>URL</acronym> 自体を
  90. camelCasing 形式で書くこともできます。
  91. この場合でも、ディスパッチャは <acronym>URL</acronym> を同じアクションメソッドに解決します。
  92. たとえば 'camel-cased' はディスパッチャによって
  93. 'camelCasedAction' になります。一方 'camelCased' は
  94. 'camelcasedAction' となります。<acronym>PHP</acronym> では大文字小文字を細かく区別しないため、
  95. これらはどちらも同じメソッドを実行することになります。
  96. </para>
  97. <para>
  98. これは、ViewRenderer がビュースクリプトを解決する際に問題を引き起こします。
  99. ドキュメントに記載されている正式な方法は、
  100. 単語の区切りをすべてダッシュに変換して単語は小文字にするというものです。
  101. こうすればアクションとビュースクリプトの関連が明確になり、
  102. 小文字への正規化でスクリプトが見つかることが確実となります。
  103. しかし、アクション 'camelCased' がコールされて解決された場合は、
  104. 単語の区切りはもう存在しません。そして ViewRenderer は
  105. <filename>camel-cased.phtml</filename> ではない別のファイル -- <filename>camelcased.phtml</filename>
  106. を探してしまうのです。
  107. </para>
  108. <para>
  109. 中にはこの "機能" を使用している開発者もいるようますが、
  110. これは決して意図した機能ではありません。
  111. 1.5.0 のツリーでは、ViewRenderer はこの方式の解決を行わなくなりました。
  112. これでアクションとビュースクリプトの結びつきが確実になったわけです。
  113. まず、ディスパッチャはアクション名の大文字小文字をきちんと区別するようになります。
  114. つまり、camelCasing 形式を使用したアクションの解決先は、
  115. 単語の区切りを使用した ('camel-casing') 場合とは違うものになるということです。
  116. これで、ViewRenderer がビュースクリプトを解決する際には
  117. 区切り文字を使用したアクションのみを使用することになります。
  118. </para>
  119. <para>
  120. 今までこの "機能" に頼っていた人たちは、
  121. 以下のいずれかの方法で対応します。
  122. </para>
  123. <itemizedlist>
  124. <listitem><para>
  125. 一番いい方法: ビュースクリプトの名前を変更する。
  126. 利点: 前方互換性。欠点: もし対象となるビュースクリプトが多い場合は、
  127. 多くのファイルの名前を変更しなければならなくなります。
  128. </para></listitem>
  129. <listitem>
  130. <para>
  131. その次にいい方法: ViewRenderer はビュースクリプトの解決を
  132. <classname>Zend_Filter_Inflector</classname> に委譲しています。
  133. インフレクタのルールを変更し、
  134. アクションの単語間をダッシュで区切らないようにします。
  135. </para>
  136. <programlisting language="php"><![CDATA[
  137. $viewRenderer =
  138. Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
  139. $inflector = $viewRenderer->getInflector();
  140. $inflector->setFilterRule(':action', array(
  141. new Zend_Filter_PregReplace(
  142. '#[^a-z0-9' . preg_quote(DIRECTORY_SEPARATOR, '#') . ']+#i',
  143. ''
  144. ),
  145. 'StringToLower'
  146. ));
  147. ]]></programlisting>
  148. <para>
  149. 上のコードは、インフレクタを変更して単語をダッシュで区切らないようにしています。
  150. もし実際のビュースクリプト名を camelCased にしたいのなら、さらに
  151. 'StringToLower' フィルタも削除することになるでしょう。
  152. </para>
  153. <para>
  154. ビュースクリプトの名前を変えるのが面倒だったり
  155. 時間がかかったりする場合は、
  156. もしあまり時間を割けないのならこの方法が最適です。
  157. </para>
  158. </listitem>
  159. <listitem>
  160. <para>
  161. あまりお勧めしない方法: ディスパッチャに camelCased
  162. 形式のアクションをディスパッチさせるよう、フロントコントローラのフラグ
  163. <property>useCaseSensitiveActions</property> を設定します。
  164. </para>
  165. <programlisting language="php"><![CDATA[
  166. $front->setParam('useCaseSensitiveActions', true);
  167. ]]></programlisting>
  168. <para>
  169. これで camelCasing 形式の URL を使えるようになり、
  170. 単語の区切り文字を使用した場合と同じアクションに解決されるようになります。
  171. しかし、もともと抱えていた問題も残ったままとなってしまいます。
  172. できれば先ほどのふたつのうちのいずれかを使用したほうがいいでしょう。
  173. </para>
  174. <para>
  175. このフラグを使用していると、
  176. 将来このフラグが廃止予定になったときに notice が発生することになります。
  177. </para>
  178. </listitem>
  179. </itemizedlist>
  180. </sect2>
  181. <sect2 id="zend.controller.migration.fromzeroninethree">
  182. <title>0.9.3 から 1.0.0RC1 以降への移行</title>
  183. <para>
  184. 1.0.0RC1 での最大の変更点は、
  185. <link linkend="zend.controller.plugins.standard.errorhandler">ErrorHandler</link>
  186. プラグインと
  187. <link linkend="zend.controller.actionhelpers.viewrenderer">ViewRenderer</link>
  188. アクションヘルパーが追加され、デフォルトで有効となったことです。
  189. それぞれのドキュメントを熟読し、どのように動作するのかや
  190. 既存のアプリケーションに与える影響について確認しておきましょう。
  191. </para>
  192. <para>
  193. <classname>ErrorHandler</classname> プラグインは
  194. <methodname>postDispatch()</methodname> で動作するもので、
  195. 例外をチェックして指定したエラーハンドラコントローラに転送します。
  196. そのため、アプリケーション内にエラー処理用コントローラを含める必要があります。
  197. このプラグインを無効にするには、フロントコントローラのパラメータ
  198. <property>noErrorHandler</property> を設定します。
  199. </para>
  200. <programlisting language="php"><![CDATA[
  201. $front->setParam('noErrorHandler', true);
  202. ]]></programlisting>
  203. <para>
  204. <classname>ViewRenderer</classname> アクションヘルパーは、
  205. アクションコントローラへのビューの注入を自動的に行います。
  206. また、現在のアクションにもとづいたビュースクリプトを自動的にレンダリングします。
  207. ビュースクリプトをレンダリングせず、かつ転送やリダイレクトも行わないアクションがあった場合、
  208. これは問題になるでしょう。というのも、
  209. <classname>ViewRenderer</classname> はそんなアクションであっても
  210. アクション名をもとに自動的にビュースクリプトをレンダリングしようとするからです。
  211. </para>
  212. <para>
  213. もし既存のコードにそのようなものがあった場合の対応方法はいくつか考えられます。
  214. 一番手っ取り早いのは、フロントコントローラの起動時に
  215. <classname>ViewRenderer</classname> を無効にしてからディスパッチを行うことです。
  216. </para>
  217. <programlisting language="php"><![CDATA[
  218. // $front は Zend_Controller_Front のインスタンスであるとします
  219. $front->setParam('noViewRenderer', true);
  220. ]]></programlisting>
  221. <para>
  222. しかし、長い目で見ればこれはあまりよい作戦ではありません。
  223. 今後も新しいコードを書き続けるならなおさらです。
  224. </para>
  225. <para>
  226. <classname>ViewRenderer</classname> の機能を把握したら、コントローラのコードを見てみましょう。
  227. まず、アクションメソッド (名前が 'Action' で終わっているメソッド)
  228. を探し、その中でどんな処理をしているかを確認しましょう。
  229. もし次に挙げるいずれの内容も行っていない場合は、コードに手を加える必要があります。
  230. </para>
  231. <itemizedlist>
  232. <listitem><para><command>$this->render();</command> のコール</para></listitem>
  233. <listitem><para><command>$this->_forward();</command> のコール</para></listitem>
  234. <listitem><para><command>$this->_redirect();</command> のコール</para></listitem>
  235. <listitem><para><classname>Redirector</classname> アクションヘルパーのコール</para></listitem>
  236. </itemizedlist>
  237. <para>
  238. 一番簡単なのは、そのメソッド内で自動レンダリングを無効にすることです。
  239. </para>
  240. <programlisting language="php"><![CDATA[
  241. $this->_helper->viewRenderer->setNoRender();
  242. ]]></programlisting>
  243. <para>
  244. レンダリング、転送あるいはリダイレクトを行っているアクションメソッドがひとつもない場合は、
  245. 上で示したコードを <methodname>preDispatch()</methodname>
  246. メソッドあるいは <methodname>init()</methodname> メソッド内に書くといいでしょう。
  247. </para>
  248. <programlisting language="php"><![CDATA[
  249. public function preDispatch()
  250. {
  251. // ビュースクリプトの自動レンダリングを無効にします
  252. $this->_helper->viewRenderer->setNoRender()
  253. // .. 何かほかのことをします...
  254. }
  255. ]]></programlisting>
  256. <para>
  257. もしメソッド内で <methodname>render()</methodname> をコールしていて、
  258. <link linkend="zend.controller.modular">規約どおりのディレクトリ構造</link>
  259. を使用しているのなら、自動レンダリングを使用するようにコードを書き換えましょう。
  260. </para>
  261. <itemizedlist>
  262. <listitem>
  263. <para>
  264. ひとつのアクションで複数のビュースクリプトをレンダリングしている場合は、
  265. なにも変更する必要はありません。
  266. </para>
  267. </listitem>
  268. <listitem>
  269. <para>
  270. 何も引数を指定せずに <methodname>render()</methodname> をコールしている場合は、
  271. その行を削除します。
  272. </para>
  273. </listitem>
  274. <listitem>
  275. <para>
  276. 引数つきで <methodname>render()</methodname> をコールしていて、
  277. その後に何か処理をしたり複数のビュースクリプトを実行したりしていない場合は、
  278. その行を
  279. <command>$this->_helper->viewRenderer();</command>
  280. のように変更します。
  281. </para>
  282. </listitem>
  283. </itemizedlist>
  284. <para>
  285. 独自のディレクトリ構造を使用している場合は、
  286. ビューの基底パスやスクリプトのパスをメソッドで設定してから
  287. <classname>ViewRenderer</classname> を使用します。これらのメソッドについての詳細は
  288. <link linkend="zend.controller.actionhelpers.viewrenderer">ViewRenderer
  289. のドキュメント</link> を参照ください。
  290. </para>
  291. <para>
  292. ビューオブジェクトをレジストリから取得していたり
  293. ビューオブジェクトをカスタマイズしていたり、
  294. あるいはデフォルトとは異なるビューを使用している場合は、
  295. そのオブジェクトを <classname>ViewRenderer</classname>
  296. に注入するために次のようにします。
  297. これはいつでも好きなときに行えます。
  298. </para>
  299. <itemizedlist>
  300. <listitem>
  301. <para>
  302. フロントコントローラのインスタンスをディスパッチする前なら
  303. </para>
  304. <programlisting language="php"><![CDATA[
  305. // $view はすでに定義されているものとします
  306. $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
  307. Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
  308. ]]></programlisting>
  309. </listitem>
  310. <listitem>
  311. <para>
  312. 起動処理の中ならどこでも
  313. </para>
  314. <programlisting language="php"><![CDATA[
  315. $viewRenderer =
  316. Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
  317. $viewRenderer->setView($view);]]></programlisting>
  318. </listitem>
  319. </itemizedlist>
  320. <para>
  321. <classname>ViewRenderer</classname> を変更するにはさまざまな方法があります。
  322. たとえばレンダリングするビュースクリプトを別のものに変更したり
  323. ビュースクリプトパスの置換可能な要素(サフィックスを含む)
  324. を置換する内容を指定したり、使用するレスポンスセグメントを選択したりなどのことができます。
  325. 規約どおりのディレクトリ構造以外を使用する場合は、
  326. <classname>ViewRenderer</classname> でのパスの決定方法を変更することもできます。
  327. </para>
  328. <para>
  329. <classname>ErrorHandler</classname> および <classname>ViewRenderer</classname>
  330. は今やコア機能として組み込まれているので、
  331. 既存のコードについてもできるだけこれに適合するようにすることをお勧めします。
  332. </para>
  333. </sect2>
  334. <sect2 id="zend.controller.migration.fromzeroninetwo">
  335. <title>0.9.2 から 0.9.3 以降への移行</title>
  336. <para>
  337. 0.9.3 では <link
  338. linkend="zend.controller.actionhelpers">アクションヘルパー</link>
  339. が利用できるようになりました。この変更にともない、以下のメソッドが削除され、
  340. <link linkend="zend.controller.actionhelpers.redirector">リダイレクタ
  341. アクションヘルパー</link> に組み込まれました。
  342. </para>
  343. <itemizedlist>
  344. <listitem>
  345. <para>
  346. <methodname>setRedirectCode()</methodname> の代わりに
  347. <methodname>Zend_Controller_Action_Helper_Redirector::setCode()</methodname>
  348. を使用します。
  349. </para>
  350. </listitem>
  351. <listitem>
  352. <para>
  353. <methodname>setRedirectPrependBase()</methodname> の代わりに
  354. <methodname>Zend_Controller_Action_Helper_Redirector::setPrependBase()</methodname>
  355. を使用します。
  356. </para>
  357. </listitem>
  358. <listitem>
  359. <para>
  360. <methodname>setRedirectExit()</methodname> の代わりに
  361. <methodname>Zend_Controller_Action_Helper_Redirector::setExit()</methodname>
  362. を使用します。
  363. </para>
  364. </listitem>
  365. </itemizedlist>
  366. <para>
  367. ヘルパーオブジェクトの取得方法や操作方法についての詳細は
  368. <link linkend="zend.controller.actionhelpers">アクションヘルパーのドキュメント</link> を、
  369. そしてリダイレクトの設定方法(新しいメソッドなど)についての詳細は
  370. <link linkend="zend.controller.actionhelpers.redirector">リダイレクタ
  371. アクションヘルパーのドキュメント</link> を参照ください。
  372. </para>
  373. </sect2>
  374. <sect2 id="zend.controller.migration.fromzerosix">
  375. <title>0.6.0 から 0.8.0 以降への移行</title>
  376. <para>
  377. 前回変更された、もっとも基本的な <acronym>MVC</acronym> コンポーネントの使用法は、そのまま同じです。
  378. </para>
  379. <programlisting language="php"><![CDATA[
  380. Zend_Controller_Front::run('/path/to/controllers');
  381. ]]></programlisting>
  382. <para>
  383. しかし、ディレクトリ構造を見直し、いくつかのコンポーネントが削除されました。
  384. また、名前が変更されたり新たに追加されたものもあります。以下にそれらをまとめます。
  385. </para>
  386. <itemizedlist>
  387. <listitem>
  388. <para>
  389. <classname>Zend_Controller_Router</classname> は削除されました。
  390. かわりに rewrite ルータを使用してください。
  391. </para>
  392. </listitem>
  393. <listitem>
  394. <para>
  395. <classname>Zend_Controller_RewriteRouter</classname> は
  396. <classname>Zend_Controller_Router_Rewrite</classname> という名前に変わり、
  397. このフレームワークの標準ルータに格上げされました。
  398. <classname>Zend_Controller_Front</classname> は、
  399. 特に別のルータを指定しない限りこのルータをデフォルトで使用します。
  400. </para>
  401. </listitem>
  402. <listitem>
  403. <para>
  404. rewrite ルータで使用する、新しいルートクラスが追加されました。名前は
  405. <classname>Zend_Controller_Router_Route_Module</classname> です。
  406. これは <acronym>MVC</acronym> で使用するデフォルトのルートのほかに、<link
  407. linkend="zend.controller.modular">コントローラモジュール
  408. </link> をサポートしています。
  409. </para>
  410. </listitem>
  411. <listitem>
  412. <para>
  413. <classname>Zend_Controller_Router_StaticRoute</classname> は
  414. <classname>Zend_Controller_Router_Route_Static</classname> という名前に変わりました。
  415. </para>
  416. </listitem>
  417. <listitem>
  418. <para>
  419. <classname>Zend_Controller_Dispatcher</classname> は
  420. <classname>Zend_Controller_Dispatcher_Standard</classname> という名前に変わりました。
  421. </para>
  422. </listitem>
  423. <listitem>
  424. <para>
  425. <methodname>Zend_Controller_Action::_forward()</methodname> の引数が変わりました。
  426. 新しいシグネチャは次のとおりです。
  427. </para>
  428. <programlisting language="php"><![CDATA[
  429. final protected function _forward($action,
  430. $controller = null,
  431. $module = null,
  432. array $params = null);
  433. ]]></programlisting>
  434. <para>
  435. <varname>$action</varname> は常に必須です。
  436. コントローラを指定しなかった場合は、
  437. 現在のコントローラ内のアクションであるとみなされます。
  438. <varname>$controller</varname> を指定しなかった場合は、
  439. <varname>$module</varname> は常に無視されます。
  440. 最後に、<varname>$params</varname> で指定した任意の値が
  441. リクエストオブジェクトに追加されます。
  442. コントローラやモジュールは不要だがパラメータは渡したいという場合は、
  443. コントローラやモジュールに <constant>NULL</constant> を指定します。
  444. </para>
  445. </listitem>
  446. </itemizedlist>
  447. </sect2>
  448. <sect2 id="zend.controller.migration.fromzerotwo">
  449. <title>0.2.0 以前のバージョンから 0.6.0 への移行</title>
  450. <para>
  451. <acronym>MVC</acronym> コンポーネントの基本的な部分は変わっていません。
  452. 次のいずれの方法も使用可能です。
  453. </para>
  454. <programlisting language="php"><![CDATA[
  455. Zend_Controller_Front::run('/path/to/controllers');
  456. ]]></programlisting>
  457. <programlisting language="php"><![CDATA[
  458. /* -- ルータを作成します -- */
  459. $router = new Zend_Controller_RewriteRouter();
  460. $router->addRoute('user',
  461. 'user/:username',
  462. array('controller' => 'user', 'action' => 'info')
  463. );
  464. /* -- ルータをコントローラに設定します -- */
  465. $ctrl = Zend_Controller_Front::getInstance();
  466. $ctrl->setRouter($router);
  467. /* -- コントローラのディレクトリを設定し、ディスパッチします -- */
  468. $ctrl->setControllerDirectory('/path/to/controllers');
  469. $ctrl->dispatch();
  470. ]]></programlisting>
  471. <para>
  472. レスポンスオブジェクトを使用して、コンテンツとヘッダを取得することを推奨します。
  473. これにより、アプリケーション内で
  474. より柔軟な出力書式の切り替え (たとえば <acronym>XHTML</acronym> ではなく
  475. <acronym>JSON</acronym> や <acronym>XML</acronym> を使用するなど) ができるようになります。
  476. デフォルトでは、<methodname>dispatch()</methodname> はレスポンスのレンダリングを行い、
  477. ヘッダとレンダリングされた内容の両方を送信します。
  478. フロントコントローラから <methodname>returnResponse()</methodname>
  479. を使用してレスポンスを返し、レスポンスのレンダリングを独自に行うこともできます。
  480. 将来のバージョンのフロントコントローラでは、
  481. レスポンスオブジェクトに出力バッファリングを使用する予定です。
  482. </para>
  483. <para>
  484. これまでの <acronym>API</acronym> に加え、多くの機能が追加されています。
  485. 追加された機能についてはドキュメントを参照ください。
  486. </para>
  487. <para>
  488. 最大の変更点は、多くのコンポーネントで
  489. サブクラス化による拡張が可能になったことです。以下にポイントを整理します。
  490. </para>
  491. <itemizedlist>
  492. <listitem>
  493. <para>
  494. <methodname>Zend_Controller_Front::dispatch()</methodname>
  495. は、デフォルトでレスポンスオブジェクトの例外をトラップします。
  496. 例外の内容はレンダリングしません。これにより、
  497. システムについての機密情報がレンダリングされてしまうことを防ぎます。
  498. この挙動を変更するにはいくつかの方法があります。
  499. </para>
  500. <itemizedlist>
  501. <listitem>
  502. <para>
  503. フロントコントローラで <methodname>throwExceptions()</methodname>
  504. を設定します。
  505. </para>
  506. <programlisting language="php"><![CDATA[
  507. $front->throwExceptions(true);
  508. ]]></programlisting>
  509. </listitem>
  510. <listitem>
  511. <para>
  512. レスポンスオブジェクトで <methodname>renderExceptions()</methodname>
  513. を設定します。
  514. </para>
  515. <programlisting language="php"><![CDATA[
  516. $response->renderExceptions(true);
  517. $front->setResponse($response);
  518. $front->dispatch();
  519. // あるいは
  520. $front->returnResponse(true);
  521. $response = $front->dispatch();
  522. $response->renderExceptions(true);
  523. echo $response;
  524. ]]></programlisting>
  525. </listitem>
  526. </itemizedlist>
  527. </listitem>
  528. <listitem><para>
  529. <methodname>Zend_Controller_Dispatcher_Interface::dispatch()</methodname>
  530. は、ディスパッチャトークンではなく
  531. <link linkend="zend.controller.request">リクエストオブジェクト</link>
  532. を使用するようになりました。
  533. </para></listitem>
  534. <listitem><para>
  535. <methodname>Zend_Controller_Router_Interface::route()</methodname>
  536. は、ディスパッチャトークンではなく
  537. <link linkend="zend.controller.request">リクエストオブジェクト</link>
  538. を使用するようになりました。
  539. </para></listitem>
  540. <listitem>
  541. <para><classname>Zend_Controller_Action</classname> の変更点は以下のようになります。</para>
  542. <itemizedlist>
  543. <listitem><para>
  544. コンストラクタが受け付ける引数は
  545. <classname>Zend_Controller_Request_Abstract</classname> <varname>$request</varname>、
  546. <classname>Zend_Controller_Response_Abstract</classname> <varname>$response</varname>
  547. および <type>array</type> <varname>$params</varname> (オプション) の三つになりました。
  548. <methodname>Zend_Controller_Action::__construct()</methodname>
  549. は、これらを使用してリクエストやレスポンス、
  550. そしてオブジェクトの invokeArgs プロパティを指定します。
  551. コンストラクタをオーバーライドすることで、
  552. この挙動をお望みのように変更することができます。
  553. さらによいことに、<methodname>init()</methodname>
  554. メソッドを使用してインスタンスの設定を自由に行うことができます。
  555. このメソッドは、コンストラクタでの処理の最後にコールされます。
  556. </para></listitem>
  557. <listitem><para>
  558. <methodname>run()</methodname> は final メソッドではなくなりました。
  559. しかし、このメソッドはもはやフロントコントローラでは使用されません。
  560. これは、クラスをページコントローラとして使用する場合にのみ使用します。
  561. オプションの引数
  562. <classname>Zend_Controller_Request_Abstract</classname> <varname>$request</varname>
  563. および <classname>Zend_Controller_Response_Abstract</classname> <varname>$response</varname>
  564. を受け取ります。
  565. </para></listitem>
  566. <listitem><para>
  567. <methodname>indexAction()</methodname> を定義する必要はなくなりました。
  568. しかし、デフォルトのアクションとして定義しておくことを推奨します。
  569. これにより、RewriteRouter とアクションコントローラで
  570. デフォルトのアクションメソッドを別々に指定できるようになります。
  571. </para></listitem>
  572. <listitem><para>
  573. <methodname>__call()</methodname> をオーバーライドして、
  574. 未定義のアクションが自動的に処理されるようにする必要があります。
  575. </para></listitem>
  576. <listitem><para>
  577. <methodname>_redirect()</methodname> にはオプションで二番目、三番目の引数が追加されました。
  578. 二番目の引数はリダイレクト時に返す <acronym>HTTP</acronym> コードです。
  579. 三番目の引数 <varname>$prependBase</varname>
  580. を使用すると、リクエストオブジェクトに登録したベース <acronym>URL</acronym>
  581. を <acronym>URL</acronym> の前に連結することを指示できます。
  582. </para></listitem>
  583. <listitem>
  584. <para>
  585. プロパティ <varname>$_action</varname> は設定されなくなりました。
  586. このプロパティの内容は <classname>Zend_Controller_Dispatcher_Token</classname>
  587. でしたが、これは現在のバージョンにはもう存在しません。
  588. トークンの唯一の目的は、要求されたコントローラやアクション、
  589. URL パラメータについての情報を提供することでした。
  590. これらは現在はリクエストオブジェクトから次のようにして取得できるようになっています。
  591. </para>
  592. <programlisting language="php"><![CDATA[
  593. // 要求されたコントローラ名を取得します。
  594. // その際には $this->_action->getControllerName() を使用します。
  595. // 以下の例では getRequest() を使用していますが、直接 $_request プロパティに
  596. // アクセスしてもかまいません。ただ getRequest() を使用することを推奨します。
  597. // とういのは、親クラスがこのメソッドをオーバーライドして挙動を変更しているかもしれないからです。
  598. $controller = $this->getRequest()->getControllerName();
  599. // 要求されたアクション名を取得します。
  600. // その際には $this->_action->getActionName() を使用します。
  601. $action = $this->getRequest()->getActionName();
  602. // リクエストパラメータを取得します。
  603. // これは変わっていません。_getParams() メソッドおよび _getParam() メソッドは
  604. // 現在は単なるリクエストオブジェクトへのプロキシです。
  605. $params = $this->_getParams();
  606. // パラメータ 'foo' を取得します。見つからなかった場合はデフォルト値 'default' を設定します
  607. $foo = $this->_getParam('foo', 'default');
  608. ]]></programlisting>
  609. </listitem>
  610. <listitem>
  611. <para>
  612. <methodname>noRouteAction()</methodname> は削除されました。
  613. 存在しないアクションメソッドを扱うには、
  614. <methodname>__call()</methodname> を使用してデフォルトのアクションに誘導します。
  615. </para>
  616. <programlisting language="php"><![CDATA[
  617. public function __call($method, $args)
  618. {
  619. // 存在しない 'Action' メソッドが要求された場合に、
  620. // それをデフォルトのアクションに渡します。
  621. if ('Action' == substr($method, -6)) {
  622. return $this->defaultAction();
  623. }
  624. throw new Zend_Controller_Exception('無効なメソッド呼び出しです');
  625. }
  626. ]]></programlisting>
  627. </listitem>
  628. </itemizedlist>
  629. </listitem>
  630. <listitem><para>
  631. <methodname>Zend_Controller_RewriteRouter::setRewriteBase()</methodname>
  632. は削除されました。かわりに
  633. <methodname>Zend_Controller_Front::setBaseUrl()</methodname> を使用してください
  634. (あるいは、リクエストクラスを使用している場合は
  635. <methodname>Zend_Controller_Request_Http::setBaseUrl()</methodname> を使用します)。
  636. </para></listitem>
  637. <listitem><para>
  638. <classname>Zend_Controller_Plugin_Interface</classname> は
  639. <classname>Zend_Controller_Plugin_Abstract</classname> に置き換えられました。
  640. すべてのメソッドは、ディスパッチャトークンではなく
  641. <link linkend="zend.controller.request">リクエストオブジェクト</link>
  642. をやり取りするようになりました。
  643. </para></listitem>
  644. </itemizedlist>
  645. </sect2>
  646. </sect1>
  647. <!--
  648. vim:se ts=4 sw=4 et:
  649. -->