<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<!-- EN-Revision: 16504 -->
<sect3 id="zend.controller.actionhelpers.redirector">
    <title>Redirector</title>

    <sect4 id="zend.controller.actionhelper.redirector.introduction">
        <title>導入</title>

        <para>
            <emphasis>Redirector</emphasis> ヘルパーは、
            アプリケーション内で必要となるリダイレクト処理用のオブジェクトとして使用します。
            <methodname>_redirect()</methodname> メソッドと比べた場合の利点としては、
            サイト全体で使用する設定を事前に組み込んでおけることがあります。また、
            <methodname>Zend_Controller_Action::_forward()</methodname>
            の場合と同様に、組み込みのインターフェイス
            <methodname>gotoSimple($action, $controller, $module, $params)</methodname>
            が使用できることも利点となります。
        </para>

        <para>
            <emphasis>Redirector</emphasis> では、
            リダイレクトの設定を行うメソッドとして次のようなものが用意されています。
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    <methodname>setCode()</methodname> を使用して、
                    リダイレクトの際に使用する <acronym>HTTP</acronym> レスポンスコードを設定します。
                </para>
            </listitem>

            <listitem>
                <para>
                    <methodname>setExit()</methodname> を使用して、
                    リダイレクトの後で強制的に <methodname>exit()</methodname> を実行させるようにします。
                    デフォルトは true です。
                </para>
            </listitem>

            <listitem>
                <para>
                    <methodname>setGotoSimple()</methodname> を使用して、<methodname>gotoSimple()</methodname>
                    に何も渡されなかったときのデフォルトの <acronym>URL</acronym> を設定します。
                    <methodname>Zend_Controller_Action::_forward()</methodname> の <acronym>API</acronym> である
                    <methodname>setGotoSimple($action, $controller = null, $module = null, array
                    $params = array())</methodname> を使用します。
                </para>
            </listitem>

            <listitem>
                <para>
                    <methodname>setGotoRoute()</methodname> を使用して、
                    登録済みのルートにもとづいた <acronym>URL</acronym> を設定します。
                    キー/値 のペアの配列とルート名を渡し、
                    それをもとにルートの型と定義から <acronym>URL</acronym> を作成します。
                </para>
            </listitem>

            <listitem>
                <para>
                    <methodname>setGotoUrl()</methodname> を使用して、<methodname>gotoUrl()</methodname>
                    に何も渡されなかったときのデフォルトの <acronym>URL</acronym> を設定します。
                    <acronym>URL</acronym> を表す文字列を受け取ります。
                </para>
            </listitem>

            <listitem>
                <para>
                    <methodname>setPrependBase()</methodname> を使用して、
                    <methodname>setGotoUrl()</methodname>、<methodname>gotoUrl()</methodname>
                    あるいは <methodname>gotoUrlAndExit()</methodname>
                    で指定した <acronym>URL</acronym> の前にリクエストのベース <acronym>URL</acronym> を追加します。
                </para>
            </listitem>

            <listitem>
                <para>
                    <methodname>setUseAbsoluteUri()</methodname> を使用すると、
                    <methodname>Redirector</methodname> がリダイレクトの際に絶対
                    <acronym>URI</acronym> を使用するようになります。
                    このオプションを設定すると、
                    <varname>$_SERVER['HTTP_HOST']</varname> や
                    <varname>$_SERVER['SERVER_PORT']</varname>、そして
                    <varname>$_SERVER['HTTPS']</varname> の内容をもとにして
                    リダイレクト用の完全な <acronym>URI</acronym> を作成します。
                    このオプションのデフォルト値はオフですが、
                    将来のリリースではデフォルトで有効になるかもしれません。
                </para>
            </listitem>
        </itemizedlist>

        <para>
            さらに、実際のリダイレクトを行うためのメソッドとして以下のものが用意されています。
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    <methodname>gotoSimple()</methodname> は、<methodname>setGotoSimple()</methodname>
                    (<methodname>_forward()</methodname> 風の <acronym>API</acronym>) を用いて作成した <acronym>URL</acronym>
                    にリダイレクトします。
                </para>
            </listitem>

            <listitem>
                <para>
                    <methodname>gotoRoute()</methodname> は、<methodname>setGotoRoute()</methodname>
                    (<emphasis>ルートの作成</emphasis>) を用いて作成した <acronym>URL</acronym>
                    にリダイレクトします。
                </para>
            </listitem>

            <listitem>
                <para>
                    <methodname>gotoUrl()</methodname> は <methodname>setGotoUrl()</methodname>
                    (<emphasis><acronym>URL</acronym> 文字列の指定</emphasis>) を用いて作成した <acronym>URL</acronym>
                    にリダイレクトします。
                </para>
            </listitem>
        </itemizedlist>

        <para>
            リダイレクト先の <acronym>URL</acronym> を知るには
            <methodname>getRedirectUrl()</methodname> を使用します。
            これはいつでも使用できます。
        </para>
    </sect4>

    <sect4 id="zend.controller.actionhelper.redirector.basicusage">
        <title>基本的な使用例</title>

        <example id="zend.controller.actionhelper.redirector.basicusage.example-1">
            <title>オプションの設定</title>

            <para>
                この例ではデフォルトのオプションを少し変更します。
                <acronym>HTTP</acronym> ステータスコードを 303 にし、リダイレクト後に
                exit() しないようにして、そしてリダイレクトの際のデフォルト
                <acronym>URL</acronym> を指定しています。
            </para>

            <programlisting language="php"><![CDATA[
class SomeController extends Zend_Controller_Action
{
    /**
     * Redirector - defined for code completion
     *
     * @var Zend_Controller_Action_Helper_Redirector
     */
    protected $_redirector = null;

    public function init()
    {
        $this->_redirector = $this->_helper->getHelper('Redirector');

        // リダイレクタのデフォルトのオプションを設定します
        // このオブジェクトはヘルパーブローカに登録されるので、
        // これ以降のすべてのアクションで有効となります
        $this->_redirector->setCode(303)
                          ->setExit(false)
                          ->setGotoSimple("this-action",
                                          "some-controller");
    }

    public function myAction()
    {
        /* 何かを行います */

        // 先ほど登録した URL にリダイレクトし、その後で
        // exit() します
        $this->_redirector->redirectAndExit();
        return; // 決してここには到達しません
    }
}
]]></programlisting>
        </example>

        <example id="zend.controller.actionhelper.redirector.basicusage.example-2">
            <title>デフォルト設定の使用</title>

            <para>
                この例ではデフォルト設定を使用しています。
                つまり、リダイレクトするとすぐに
                <methodname>exit()</methodname> が実行されるということです。
            </para>

            <programlisting language="php"><![CDATA[
// 別の例
class AlternativeController extends Zend_Controller_Action
{
    /**
     * Redirector - defined for code completion
     *
     * @var Zend_Controller_Action_Helper_Redirector
     */
    protected $_redirector = null;

    public function init()
    {
        $this->_redirector = $this->_helper->getHelper('Redirector');
    }

    public function myAction()
    {
        /* 何かを行います */

        $this->_redirector
            ->gotoUrl('/my-controller/my-action/param1/test/param2/test2');
        return; // リダイレクト後に自動的に exit() されるので、決してここには到達しません
    }
}
]]></programlisting>
        </example>

        <example id="zend.controller.actionhelper.redirector.basicusage.example-3">
            <title>goto() での _forward() API の使用</title>

            <para>
                <methodname>gotoSimple()</methodname> の <acronym>API</acronym> は、
                <methodname>Zend_Controller_Action::_forward()</methodname>
                と同じ形式です。違う点は、このメソッドは渡されたパラメータから <acronym>URL</acronym>
                を作成し、デフォルトルータのデフォルトフォーマットである
                <filename>:module/:controller/:action/*</filename> を使用するということです。
                また、アクションチェインではなくリダイレクトを行います。
            </para>

            <programlisting language="php"><![CDATA[
class ForwardController extends Zend_Controller_Action
{
    /**
     * Redirector - defined for code completion
     *
     * @var Zend_Controller_Action_Helper_Redirector
     */
    protected $_redirector = null;

    public function init()
    {
        $this->_redirector = $this->_helper->getHelper('Redirector');
    }

    public function myAction()
    {
        /* 何かを行います */

        // 現在のモジュールの 'my-controller' コントローラの
        // 'my-action' アクションにリダイレクトします。
        // パラメータは param1 => test、param2 => test2 となります。
        $this->_redirector->gotoSimple('my-action',
                                       'my-controller',
                                       null,
                                       array('param1' => 'test',
                                             'param2' => 'test2'
                                             )
                                       );
    }
}
]]></programlisting>
        </example>

        <example id="zend.controller.actionhelper.redirector.basicusage.example-4">
            <title>gotoRoute() でのルートアセンブリの使用</title>

            <para>
                次の例は、<link
                    linkend="zend.controller.router">ルータ</link>
                の <methodname>assemble()</methodname> メソッドを使用して、
                パラメータで指定した連想配列に基づく <acronym>URL</acronym> を作成しています。
                次のようなルートが登録されているものと仮定します。
            </para>

            <programlisting language="php"><![CDATA[
$route = new Zend_Controller_Router_Route(
    'blog/:year/:month/:day/:id',
    array('controller' => 'archive',
          'module' => 'blog',
          'action' => 'view')
);
$router->addRoute('blogArchive', $route);
]]></programlisting>

            <para>
                year を 2006、month を 4、day を 24、そして ID を 42
                として配列を渡すと、結果の <acronym>URL</acronym> は
                <filename>/blog/2006/4/24/42</filename> となります。
            </para>

            <programlisting language="php"><![CDATA[
class BlogAdminController extends Zend_Controller_Action
{
    /**
     * Redirector - defined for code completion
     *
     * @var Zend_Controller_Action_Helper_Redirector
     */
    protected $_redirector = null;

    public function init()
    {
        $this->_redirector = $this->_helper->getHelper('Redirector');
    }

    public function returnAction()
    {
        /* 何かを行います */

        // blog の過去記事にリダイレクトします。URL は
        // /blog/2006/4/24/42 になります。
        $this->_redirector->gotoRoute(
            array('year' => 2006,
                  'month' => 4,
                  'day' => 24,
                  'id' => 42),
            'blogArchive'
        );
    }
}
]]></programlisting>
        </example>
    </sect4>
</sect3>
<!--
vim:se ts=4 sw=4 et:
-->
