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

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

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

        <para>
            1.0.0RC1 での最大の変更点は、
            <link linkend="zend.controller.plugins.standard.errorhandler">ErrorHandler</link>
            プラグインと
            <link linkend="zend.controller.actionhelpers.viewrenderer">ViewRenderer</link>
            アクションヘルパーが追加され、デフォルトで有効となったことです。
            それぞれのドキュメントを熟読し、どのように動作するのかや
            既存のアプリケーションに与える影響について確認しておきましょう。
        </para>

        <para>
            <classname>ErrorHandler</classname> プラグインは
            <methodname>postDispatch()</methodname> で動作するもので、
            例外をチェックして指定したエラーハンドラコントローラに転送します。
            そのため、アプリケーション内にエラー処理用コントローラを含める必要があります。
            このプラグインを無効にするには、フロントコントローラのパラメータ
            <property>noErrorHandler</property> を設定します。
        </para>

        <programlisting language="php"><![CDATA[
$front->setParam('noErrorHandler', true);
]]></programlisting>

        <para>
            <classname>ViewRenderer</classname> アクションヘルパーは、
            アクションコントローラへのビューの注入を自動的に行います。
            また、現在のアクションにもとづいたビュースクリプトを自動的にレンダリングします。
            ビュースクリプトをレンダリングせず、かつ転送やリダイレクトも行わないアクションがあった場合、
            これは問題になるでしょう。というのも、
            <classname>ViewRenderer</classname> はそんなアクションであっても
            アクション名をもとに自動的にビュースクリプトをレンダリングしようとするからです。
        </para>

        <para>
            もし既存のコードにそのようなものがあった場合の対応方法はいくつか考えられます。
            一番手っ取り早いのは、フロントコントローラの起動時に
            <classname>ViewRenderer</classname> を無効にしてからディスパッチを行うことです。
        </para>

        <programlisting language="php"><![CDATA[
// $front は Zend_Controller_Front のインスタンスであるとします
$front->setParam('noViewRenderer', true);
]]></programlisting>

        <para>
            しかし、長い目で見ればこれはあまりよい作戦ではありません。
            今後も新しいコードを書き続けるならなおさらです。
        </para>

        <para>
            <classname>ViewRenderer</classname> の機能を把握したら、コントローラのコードを見てみましょう。
            まず、アクションメソッド (名前が 'Action' で終わっているメソッド)
            を探し、その中でどんな処理をしているかを確認しましょう。
            もし次に挙げるいずれの内容も行っていない場合は、コードに手を加える必要があります。
        </para>

        <itemizedlist>
            <listitem><para><command>$this->render();</command> のコール</para></listitem>
            <listitem><para><command>$this->_forward();</command> のコール</para></listitem>
            <listitem><para><command>$this->_redirect();</command> のコール</para></listitem>
            <listitem><para><classname>Redirector</classname> アクションヘルパーのコール</para></listitem>
        </itemizedlist>

        <para>
            一番簡単なのは、そのメソッド内で自動レンダリングを無効にすることです。
        </para>

        <programlisting language="php"><![CDATA[
$this->_helper->viewRenderer->setNoRender();
]]></programlisting>

        <para>
            レンダリング、転送あるいはリダイレクトを行っているアクションメソッドがひとつもない場合は、
            上で示したコードを <methodname>preDispatch()</methodname>
            メソッドあるいは <methodname>init()</methodname> メソッド内に書くといいでしょう。
        </para>

        <programlisting language="php"><![CDATA[
public function preDispatch()
{
    // ビュースクリプトの自動レンダリングを無効にします
    $this->_helper->viewRenderer->setNoRender()
    // .. 何かほかのことをします...
}
]]></programlisting>

        <para>
            もしメソッド内で <methodname>render()</methodname> をコールしていて、
            <link linkend="zend.controller.modular">規約どおりのディレクトリ構造</link>
            を使用しているのなら、自動レンダリングを使用するようにコードを書き換えましょう。
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    ひとつのアクションで複数のビュースクリプトをレンダリングしている場合は、
                    なにも変更する必要はありません。
                </para>
            </listitem>

            <listitem>
                <para>
                    何も引数を指定せずに <methodname>render()</methodname> をコールしている場合は、
                    その行を削除します。
                </para>
            </listitem>

            <listitem>
                <para>
                    引数つきで <methodname>render()</methodname> をコールしていて、
                    その後に何か処理をしたり複数のビュースクリプトを実行したりしていない場合は、
                    その行を
                    <command>$this->_helper->viewRenderer();</command>
                    のように変更します。
                </para>
            </listitem>
        </itemizedlist>

        <para>
            独自のディレクトリ構造を使用している場合は、
            ビューの基底パスやスクリプトのパスをメソッドで設定してから
            <classname>ViewRenderer</classname> を使用します。これらのメソッドについての詳細は
            <link linkend="zend.controller.actionhelpers.viewrenderer">ViewRenderer
            のドキュメント</link> を参照ください。
        </para>

        <para>
            ビューオブジェクトをレジストリから取得していたり
            ビューオブジェクトをカスタマイズしていたり、
            あるいはデフォルトとは異なるビューを使用している場合は、
            そのオブジェクトを <classname>ViewRenderer</classname>
            に注入するために次のようにします。
            これはいつでも好きなときに行えます。
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    フロントコントローラのインスタンスをディスパッチする前なら
                </para>

                <programlisting language="php"><![CDATA[
// $view はすでに定義されているものとします
$viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
]]></programlisting>
            </listitem>

            <listitem>
                <para>
                    起動処理の中ならどこでも
                </para>

                <programlisting language="php"><![CDATA[
$viewRenderer =
    Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
$viewRenderer->setView($view);]]></programlisting>
            </listitem>
        </itemizedlist>

        <para>
            <classname>ViewRenderer</classname> を変更するにはさまざまな方法があります。
            たとえばレンダリングするビュースクリプトを別のものに変更したり
            ビュースクリプトパスの置換可能な要素（サフィックスを含む）
            を置換する内容を指定したり、使用するレスポンスセグメントを選択したりなどのことができます。
            規約どおりのディレクトリ構造以外を使用する場合は、
            <classname>ViewRenderer</classname> でのパスの決定方法を変更することもできます。
        </para>

        <para>
            <classname>ErrorHandler</classname> および <classname>ViewRenderer</classname>
            は今やコア機能として組み込まれているので、
            既存のコードについてもできるだけこれに適合するようにすることをお勧めします。
        </para>
    </sect2>

    <sect2 id="migration.10.zend.currency">
        <title>Zend_Currency</title>

        <para>
            <classname>Zend_Currency</classname> のオブジェクトを、
            よりシンプルに作成できるようになりました。
            script パラメータを指定したり <constant>NULL</constant> に設定したりする必要がなくなったのです。
            script パラメータはオプションとなり、後で
            <methodname>setFormat()</methodname> メソッドで指定できるようになりました。
        </para>

        <programlisting language="php"><![CDATA[
$currency = new Zend_Currency($currency, $locale);
]]></programlisting>

        <para>
            <methodname>setFormat()</methodname> メソッドには、オプションの配列を渡せるようになりました。
            このオプションはそれ以降もずっと有効で、
            それまでに設定されていた値を上書きします。
            また、新たなオプション 'precision' が組み込まれました。
            現在使用できるオプションは次のとおりです。
        </para>

        <itemizedlist mark='opencircle'>
            <listitem>
                <para>
                    <emphasis>position</emphasis>:
                    以前の 'rules' パラメータを置き換えるものです。
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis>script</emphasis>:
                    以前の 'script' パラメータを置き換えるものです。
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis>format</emphasis>:
                    以前の 'locale' パラメータを置き換えるものです。
                    これは新しい通貨を設定するのではなく、
                    数値フォーマットのみを設定します。
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis>display</emphasis>:
                    以前の 'rules' パラメータを置き換えるものです。
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis>precision</emphasis>:
                    新しいパラメータです。
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis>name</emphasis>:
                    以前の 'rules' パラメータを置き換えるものです。
                    完全な通貨名を指定します。
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis>currency</emphasis>:
                    新しいパラメータです。
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis>symbol</emphasis>:
                    新しいパラメータです。
                </para>
            </listitem>
        </itemizedlist>

        <programlisting language="php"><![CDATA[
$currency->setFormat(array $options);
]]></programlisting>

        <para>
            <methodname>toCurrency()</methodname> メソッドは、オプションのパラメータ
            'script' および 'locale' をサポートしなくなりました。
            その代わりにオプションの配列を受け付けるようになります。
            この配列に含めることのできるキーは <methodname>setFormat()</methodname>
            メソッドと同じです。
        </para>

        <programlisting language="php"><![CDATA[
$currency->toCurrency($value, array $options);
]]></programlisting>

        <para>
            <methodname>getSymbol()</methodname> や <methodname>getShortName()</methodname>、
            <methodname>getName()</methodname>、<methodname>getRegionList()</methodname> そして
            <methodname>getCurrencyList()</methodname> メソッドはスタティックではなくなりました。
            オブジェクトから呼び出せます。
            パラメータを設定しなかった場合は、
            これらのメソッドはそのオブジェクトに設定されている値を返します。
        </para>
    </sect2>
</sect1>
<!--
vim:se ts=4 sw=4 et:
-->