技術日記
[Zend Framework] Zend_Applicationの利用例Edit

Zend_Applicationの利用例の原文。

4.4. 利用例

Bootstrapクラスは最小限のコードとなることが多く、しばしばブートストラップ基底クラスを継承するだけの空のスタブとなる。
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"
[development : testing]
[development : production]
しかし、カスタムの初期化コードが必要になることもあるだろう。その場合は二つの選択肢がある。一つは、_initから始まるメソッドとしてブートストラップコードを記述する方法。これらのメソッドはbootstrap()メソッドによって、まるでbootstrap<resource>()というpublicメソッドのように呼ばれ、配列を使った追加オプションを受け取る。 リソースメソッドが返した値は、ブートストラップ内のコンテナに保存される。これはリソース同士が相互連携する場合に便利だ(あるリソースオブジェクトが自分自身を他のリソースオブジェクトに注入(インジェクション)したり)。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()メソッドの('FrontController'を引数にした)呼び出しは、_initRequest()メソッドが実行されるよりも先にフロントコントローラリソースの初期化が行われていることを保証する。あの呼び出し(=$this->bootstrap('FrontController');)がリソース*1もしくはクラス内の他のメソッド*2の呼び出しのトリガーとなる。 他のオプションはリソースプラグインで使われるためのものだ。リソースプラグインは指定された初期化処理を実行するオブジェクトで、初期化方法は以下のタイミングで指定される。
  • Zend_Applicationオブジェクトが生成されるとき*3
  • ブートストラップオブジェクトの初期化処理中*4
  • ブートストラップオブジェクトへのメソッドコールを介して明示的に*5
リソースプラグインはZend_Application_Bootstrap_Resourceインターフェースを実装しており、呼び出し元(ブートストラップオブジェクト)の注入、オプションの設定、init()メソッドを持つように定義されている。たとえばカスタムの"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();
(通常のWebアプリケーション以外の)カスタムスクリプトを作る場合は、特定のリソースだけを初期化する必要があるかもしれない。*6
$application = new Zend_Application(...);
$application->getBootstrap()->bootstrap('db');
$service = new Zend_XmlRpc_Server();
$service->setClass('Foo');  // データベースを利用する
echo $service->handle();
内部メソッドやリソースを呼ぶためにbootstrap()メソッドを使う代わりに、メソッドオーバーロード(__call())を利用することもできる。*7
$application = new Zend_Application(...);
$application->getBootstrap()->bootstrapDb();

*1:=リソースプラグイン?

*2:=リソースメソッド?

*3:Zend_Applicationのコンストラクタの引数として渡されるオプション

*4:ブートストラップのコンストラクタの引数として渡されるZend_Applicationオブジェクトの持つオプション

*5:BootstrapAbstract::setOptions()やBootstrapAbstract::registerPluginResource()

*6:下記では、通常のMVC Webアプリケーションを実行する代わりに、DBリソースの初期化処理だけを利用して、XMLRPC Webサービスを実行している

*7:$boostrap->boostrap('foo')は$bootstrap->boostrapFoo()と書くこともできる。

Published At2009-06-26 09:00Updated At2019-12-30 23:55