<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<!-- EN-Revision: 17734 -->
<sect1 id="zend.application.examples">
    <title>例</title>

    <para>
        ブートストラップ・クラスそのものは、一般的にかなりごく小さいものです;
        しばしば、それは基底ブートストラップ・クラスを拡張している中身がない単純なスタブです:
    </para>

    <programlisting language="php"><![CDATA[
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
}
]]></programlisting>

    <para>
        対応する構成ファイルを伴います:
    </para>

    <programlisting language="ini"><![CDATA[
; APPLICATION_PATH/configs/application.ini
[production]
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"

[testing : production]
[development : production]
]]></programlisting>

    <para>
        しかし、カスタマイズした初期化が必要ならば、2つの選択肢ががあります。
        最初に、ブートストラップに個別のコードを指定するために
        <emphasis>_init</emphasis>で前に置かれるメソッドを書くことができます。
        これらのメソッドは<methodname>bootstrap()</methodname>によって呼ばれて、
        まるでそれらが public メソッドであるように呼ばれることもできます:
        <emphasis>bootstrap&lt;resource&gt;()</emphasis>
        それらは、任意のオプション配列を受け取るべきです。
    </para>

    <para>
        リソース・メソッドが値を返すならば、それはブートストラップでコンテナに保存されます。
        異なるリソースが相互に作用する必要があるとき、
        （例えば、別のリソースにそれ自体を注入している1つのリソース）
        これは役に立つことがあります。
        その場合、メソッド<methodname>getResource()</methodname>は、
        それらの値を取得するために使うことができます。
    </para>

    <para>
        下記の例では、リクエスト・オブジェクトを初期化するためのリソース・メソッドを示します。
        それは、トラッキング（フロントコントローラ・リソースに依存します）、
        ブートストラップからのリソース取得、
        ブートストラップに保存する値の返却することの依存性を利用します。
    </para>

    <programlisting language="php"><![CDATA[
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initRequest(array $options = array())
    {
        // フロントコントローラ・インスタンスが存在することを確認して、取り込みます。
        $this->bootstrap('FrontController');
        $front = $this->getResource('FrontController');

        // リクエストオブジェクトの初期化
        $request = new Zend_Controller_Request_Http();
        $request->setBaseUrl('/foo');

        // フロントコントローラに追加
        $front->setRequest($request);

        // この値をブートストラップでコンテナの 'request' キーに保存します。
        return $request;
    }
}
]]></programlisting>

    <para>
        この例で、<methodname>bootstrap()</methodname>を呼び出すことに注意してください;
        フロントコントローラがこのメソッドを呼ぶ前に初期化されることを確実にします。
        その呼び出しは、クラスのリソースまたは別のメソッドいずれかの引き金となるかもしれません。
    </para>

    <para>
        リソース・プラグインは、特定の初期化を実行するオブジェクトで、
        それは指定されるかもしれません:
    </para>

    <itemizedlist>
        <listitem>
            <para>
                <classname>Zend_Application</classname>オブジェクトが初期化されるとき
            </para>
        </listitem>
        <listitem>
            <para>
                ブートストラップオブジェクトの初期化中
            </para>
        </listitem>
        <listitem>
            <para>
                メソッド呼び出しを介してそれらをブートストラップ・オブジェクトで明示的に使用可能にすることによって
            </para>
        </listitem>
    </itemizedlist>

    <para>
        呼出し元とオプションを注入でき、
        <methodname>init()</methodname>メソッドをもつことを
        簡単に明確にする
        <classname>Zend_Application_Resource_ResourceAbstract</classname>を
        リソース・プラグインでは実装します。
        例えば、カスタマイズした "View" ブートストラップ・リソースは、
        以下のように見えるかもしれません:
    </para>

    <programlisting language="php"><![CDATA[
class My_Bootstrap_Resource_View
    extends Zend_Application_Resource_ResourceAbstract
{
    public function init()
    {
        $view = new Zend_View($this->getOptions());
        Zend_Dojo::enableView($view);

        $view->doctype('XHTML1_STRICT');
        $view->headTitle()->setSeparator(' - ')->append('My Site');
        $view->headMeta()->appendHttpEquiv('Content-Type',
                                           'text/html; charset=utf-8');

        $view->dojo()->setDjConfigOption('parseOnLoad', true)
                     ->setLocalPath('/js/dojo/dojo.js')
                     ->registerModulePath('../spindle', 'spindle')
                     ->addStylesheetModule('spindle.themes.spindle')
                     ->requireModule('spindle.main')
                     ->disable();

        $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper(
            'ViewRenderer'
        );
        $viewRenderer->setView($view);

        return $view;
    }
}
]]></programlisting>

    <para>
        これを使うようにブートストラップに命じるために、
        リソースプラグインのクラス名か、
        またはプラグイン・ローダ・プレフィックス・パスと
        リソースプラグインの短い名前（例えば "view" ）の組み合わせを
        提供する必要があるでしょう:
    </para>

    <programlisting language="php"><![CDATA[
$application = new Zend_Application(
    APPLICATION_ENV,
    array(
        'resources' => array(
            'My_Bootstrap_Resource_View' => array(), // 完全クラス名;
            'view' => array(),                       // または短い名前

            'FrontController' => array(
                'controllerDirectory' => APPLICATION_PATH . '/controllers',
            ),
        ),

        // 短い名前のためにプラグインパスを定義します:
        'pluginPaths = array(
            'My_Bootstrap_Resource' => 'My/Bootstrap/Resource',
        )
    )
);
]]></programlisting>

    <para>
        リソースは、親ブートストラップにアクセスすることによって、
        他のリソースとイニシャライザを呼び出すことができます:
    </para>

    <programlisting language="php"><![CDATA[
class My_Bootstrap_Resource_Layout
    extends Zend_Application_Resource_ResourceAbstract
{
    public function init()
    {
        // ビューが初期化されたか確認
        $this->getBootstrap()->bootstrap('view');

        // ビューオブジェクトを取得:
        $view = $this->getBootstrap()->getResource('view');

        // ...
    }
}
]]></programlisting>

    <para>
        通常の使用法では、アプリケーションをインスタンス化して、
        起動して実行するでしょう:
    </para>

    <programlisting language="php"><![CDATA[
$application = new Zend_Application(...);
$application->bootstrap()
            ->run();
]]></programlisting>

    <para>
        カスタマイズしたスクリプトについては、
        特定のリソースを単純に初期化する必要があるかもしれません:
    </para>

    <programlisting language="php"><![CDATA[
$application = new Zend_Application(...);
$application->getBootstrap()->bootstrap('db');

$service = new Zend_XmlRpc_Server();
$service->setClass('Foo');  // データベースの利用
echo $service->handle();
]]></programlisting>

    <para>
        内部のメソッドまたはリソースを呼び出す
        <methodname>bootstrap()</methodname>メソッドを使用する代わりに、
        オーバーローディングも使うかもしれません:
    </para>

    <programlisting language="php"><![CDATA[
$application = new Zend_Application(...);
$application->getBootstrap()->bootstrapDb();
]]></programlisting>
</sect1>
