<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<!-- EN-Revision: 24249 -->
<sect1 id="migration.06">
    <title>Zend Framework 0.6(日本語)</title>

    <para>
        以前のバージョンから Zend Framework 0.6 またはそれ以降に更新する際は、
        下記の移行上の注意点に注意すべきです。
    </para>

    <sect2 id="migration.06.zend.controller">
        <title>Zend_Controller</title>

        <para>
            <acronym>MVC</acronym> コンポーネントの基本的な部分は変わっていません。
            次のいずれの方法も使用可能です。
        </para>

        <programlisting language="php"><![CDATA[
Zend_Controller_Front::run('/path/to/controllers');
]]></programlisting>

        <programlisting language="php"><![CDATA[
/* -- ルータを作成します -- */
$router = new Zend_Controller_RewriteRouter();
$router->addRoute('user',
                  'user/:username',
                  array('controller' => 'user', 'action' => 'info')
);

/* -- ルータをコントローラに設定します -- */
$ctrl = Zend_Controller_Front::getInstance();
$ctrl->setRouter($router);

/* -- コントローラのディレクトリを設定し、ディスパッチします -- */
$ctrl->setControllerDirectory('/path/to/controllers');
$ctrl->dispatch();
]]></programlisting>

        <para>
            レスポンスオブジェクトを使用して、コンテンツとヘッダを取得することを推奨します。
            これにより、アプリケーション内で
            より柔軟な出力書式の切り替え (たとえば <acronym>XHTML</acronym> ではなく
            <acronym>JSON</acronym> や <acronym>XML</acronym> を使用するなど) ができるようになります。
            デフォルトでは、<methodname>dispatch()</methodname> はレスポンスのレンダリングを行い、
            ヘッダとレンダリングされた内容の両方を送信します。
            フロントコントローラから <methodname>returnResponse()</methodname>
            を使用してレスポンスを返し、レスポンスのレンダリングを独自に行うこともできます。
            将来のバージョンのフロントコントローラでは、
            レスポンスオブジェクトに出力バッファリングを使用する予定です。
        </para>

        <para>
            これまでの <acronym>API</acronym> に加え、多くの機能が追加されています。
            追加された機能についてはドキュメントを参照ください。
        </para>

        <para>
            最大の変更点は、多くのコンポーネントで
            サブクラス化による拡張が可能になったことです。以下にポイントを整理します。
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    <methodname>Zend_Controller_Front::dispatch()</methodname>
                    は、デフォルトでレスポンスオブジェクトの例外をトラップします。
                    例外の内容はレンダリングしません。これにより、
                    システムについての機密情報がレンダリングされてしまうことを防ぎます。
                    この挙動を変更するにはいくつかの方法があります。
                </para>

                <itemizedlist>
                    <listitem>
                        <para>
                            フロントコントローラで <methodname>throwExceptions()</methodname>
                            を設定します。
                        </para>
                        <programlisting language="php"><![CDATA[
$front->throwExceptions(true);
]]></programlisting>
                    </listitem>

                    <listitem>
                        <para>
                            レスポンスオブジェクトで <methodname>renderExceptions()</methodname>
                            を設定します。
                        </para>
                        <programlisting language="php"><![CDATA[
$response->renderExceptions(true);
$front->setResponse($response);
$front->dispatch();

// あるいは
$front->returnResponse(true);
$response = $front->dispatch();
$response->renderExceptions(true);
echo $response;
]]></programlisting>
                    </listitem>
                </itemizedlist>
            </listitem>

            <listitem><para>
                <methodname>Zend_Controller_Dispatcher_Interface::dispatch()</methodname>
                は、ディスパッチャトークンではなく
                <link linkend="zend.controller.request">リクエストオブジェクト</link>
                を使用するようになりました。
            </para></listitem>

            <listitem><para>
                <methodname>Zend_Controller_Router_Interface::route()</methodname>
                は、ディスパッチャトークンではなく
                <link linkend="zend.controller.request">リクエストオブジェクト</link>
                を使用するようになりました。
            </para></listitem>

            <listitem>
                <para><classname>Zend_Controller_Action</classname> の変更点は以下のようになります。</para>

                <itemizedlist>
                    <listitem><para>
                        コンストラクタが受け付ける引数は
                        <classname>Zend_Controller_Request_Abstract</classname> <varname>$request</varname>、
                        <classname>Zend_Controller_Response_Abstract</classname> <varname>$response</varname>
                        および <type>array</type> <varname>$params</varname> (オプション) の三つになりました。
                        <methodname>Zend_Controller_Action::__construct()</methodname>
                        は、これらを使用してリクエストやレスポンス、
                        そしてオブジェクトの invokeArgs プロパティを指定します。
                        コンストラクタをオーバーライドすることで、
                        この挙動をお望みのように変更できます。
                        さらによいことに、<methodname>init()</methodname>
                        メソッドを使用してインスタンスの設定を自由に行うことができます。
                        このメソッドは、コンストラクタでの処理の最後にコールされます。
                    </para></listitem>

                    <listitem><para>
                        <methodname>run()</methodname> は final メソッドではなくなりました。
                        しかし、このメソッドはもはやフロントコントローラでは使用されません。
                        これは、クラスをページコントローラとして使用する場合にのみ使用します。
                        オプションの引数
                        <classname>Zend_Controller_Request_Abstract</classname> <varname>$request</varname>
                        および <classname>Zend_Controller_Response_Abstract</classname> <varname>$response</varname>
                        を受け取ります。
                    </para></listitem>

                    <listitem><para>
                        <methodname>indexAction()</methodname> を定義する必要はなくなりました。
                        しかし、デフォルトのアクションとして定義しておくことを推奨します。
                        これにより、RewriteRouter とアクションコントローラで
                        デフォルトのアクションメソッドを別々に指定できるようになります。
                    </para></listitem>

                    <listitem><para>
                        <methodname>__call()</methodname> をオーバーライドして、
                        未定義のアクションが自動的に処理されるようにする必要があります。
                    </para></listitem>

                    <listitem><para>
                        <methodname>_redirect()</methodname> にはオプションで二番目、三番目の引数が追加されました。
                        二番目の引数はリダイレクト時に返す <acronym>HTTP</acronym> コードです。
                        三番目の引数 <varname>$prependBase</varname>
                        を使用すると、リクエストオブジェクトに登録したベース <acronym>URL</acronym>
                        を <acronym>URL</acronym> の前に連結することを指示できます。
                    </para></listitem>

                    <listitem>
                        <para>
                            プロパティ <varname>$_action</varname> は設定されなくなりました。
                            このプロパティの内容は <classname>Zend_Controller_Dispatcher_Token</classname>
                            でしたが、これは現在のバージョンにはもう存在しません。
                            トークンの唯一の目的は、要求されたコントローラやアクション、
                            URL パラメータについての情報を提供することでした。
                            これらは現在はリクエストオブジェクトから次のようにして取得できるようになっています。
                        </para>

                        <programlisting language="php"><![CDATA[
// 要求されたコントローラ名を取得します。
// その際には $this->_action->getControllerName() を使用します。
// 以下の例では getRequest() を使用していますが、直接 $_request プロパティに
// アクセスしてもかまいません。ただ getRequest() を使用することを推奨します。
// とういのは、親クラスがこのメソッドをオーバーライドして挙動を変更しているかもしれないからです。
$controller = $this->getRequest()->getControllerName();

// 要求されたアクション名を取得します。
// その際には $this->_action->getActionName() を使用します。
$action = $this->getRequest()->getActionName();

// リクエストパラメータを取得します。
// これは変わっていません。_getParams() メソッドおよび _getParam() メソッドは
// 現在は単なるリクエストオブジェクトへのプロキシです。
$params = $this->_getParams();
// パラメータ 'foo' を取得します。見つからなかった場合はデフォルト値 'default' を設定します
$foo = $this->_getParam('foo', 'default');
]]></programlisting>
                    </listitem>

                    <listitem>
                        <para>
                            <methodname>noRouteAction()</methodname> は削除されました。
                            存在しないアクションメソッドを扱うには、
                            <methodname>__call()</methodname> を使用してデフォルトのアクションに誘導します。
                        </para>

                        <programlisting language="php"><![CDATA[
public function __call($method, $args)
{
    // 存在しない 'Action' メソッドが要求された場合に、
    // それをデフォルトのアクションに渡します。
    if ('Action' == substr($method, -6)) {
        return $this->defaultAction();
    }

    throw new Zend_Controller_Exception('無効なメソッド呼び出しです');
}
]]></programlisting>
                    </listitem>
                </itemizedlist>
            </listitem>

            <listitem><para>
                <methodname>Zend_Controller_RewriteRouter::setRewriteBase()</methodname>
                は削除されました。かわりに
                <methodname>Zend_Controller_Front::setBaseUrl()</methodname> を使用してください
                (あるいは、リクエストクラスを使用している場合は
                <methodname>Zend_Controller_Request_Http::setBaseUrl()</methodname> を使用します)。
            </para></listitem>

            <listitem><para>
                <classname>Zend_Controller_Plugin_Interface</classname> は
                <classname>Zend_Controller_Plugin_Abstract</classname> に置き換えられました。
                すべてのメソッドは、ディスパッチャトークンではなく
                <link linkend="zend.controller.request">リクエストオブジェクト</link>
                をやり取りするようになりました。
            </para></listitem>
        </itemizedlist>
    </sect2>
</sect1>
<!--
vim:se ts=4 sw=4 et:
-->