【Zend】処理中にbootstrapを取得する方法

controllerの中なら、

1
$bootstrap = $this->getInvokeArg('bootstrap');

で取得できる。

modelとかの中でも

1
$bootstrap = Zend_Controller_Front::getInstance()->getParam('bootstrap');

で取得できる

bootstrap取得して何をするかというと、application.iniで設定したリソースを取得できる。

例えば、multidbリソースを使ってたとすると

1
$bootstrap->getPluginResource('multidb')->getDb('hoge1');

みたいに、hoge1 DBへのDBアダプターが取得できる。

このアダプターを、各テーブルクラスのコンストラクタで、テーブルのアダプターとして設定してあげると、普段Default_Adapterを設定しているときのように、どのアダプタを使うとかを、プログラムを作るときに意識しなくていい。

== その後1 ==

生成されたPluginリソース(Zend/Application/Resourceとかにあるやつ)は、

BootstrapのContainer(中身はZend_Registryインスタンス)に入ってたので。

1
$boostrap->getContainer()->multidb->getDb('hoge1');

でも同様のDBアダプターが取得できる。

getPluginResource()だと、インスタンスがなかった場合作ってくれるが、

Container経由だと、なかったらnullが返ってくるはず。

どっちもpublicメソッドなので、どちらでも使える。

処理数でいうと、getContainerが少ない(チェックとかないため)ので、

最初からインスタンスがあるってわかってるものについては、getContainer()経由がいいのかも。

== その後2 ==

ソース見ても、getPluginResource()は、bootstrapの中からしか呼ばれてないし、

protectedでいいと思うんだけど、なんでだろう?

自前のBootstrap作るときも、Bootstrapクラス継承するから問題ないし。

クラス外から呼ばれることを想定していたとして、どういう場合かがわからん。

getContainer()一本でいいのに。