4.4. 例

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

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
}

対応する構成ファイルを伴います:

; 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]

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

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

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

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;
    }
}

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

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

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

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;
    }
}

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

$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',
        )
    )
);

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

class My_Bootstrap_Resource_Layout
    extends Zend_Application_Resource_ResourceAbstract
{
    public function init()
    {
        // ビューが初期化されたか確認
        $this->getBootstrap()->bootstrap('view');

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

        // ...
    }
}

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

$application = new Zend_Application(...);
$application->bootstrap()
            ->run();

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

$application = new Zend_Application(...);
$application->getBootstrap()->bootstrap('db');

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

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

$application = new Zend_Application(...);
$application->getBootstrap()->bootstrapDb();