これは古い質問であることは知っていますが、これは常に私を悩ませていたものです。ZF 2 がそれを解決するために何かをしたかどうかはわかりませんが (私はまだそれを試す機会がありませんでした)、ZF 1 でこれに対処するプラグイン ローダー プラグインを書きました!
もちろん問題は、モジュール オートローダをセットアップしてプラグインをモジュールのプラグイン フォルダに保持している場合でも、登録ではなくオートローディング (クロス モジュール) のみをセットアップすることです。これは、application.ini の 1 行でプラグインをインスタンス化できることを意味しますが、モジュールごとに自動ロードおよび登録されます。
とにかく、モジュールプラグインがアクティブなモジュールに対してのみ登録されていることを確認するための可能な解決策があります。別の方法として、クラス マップを提供する代わりに、モジュールのプラグイン ディレクトリ内のすべてのファイルをループすることもできますが、それは見苦しく感じます...そしておそらく遅いでしょう。
<?php
class BaseTen_Controller_Plugin_ModulePluginLoader extends Zend_Controller_Plugin_Abstract {
private $_pluginMap;
public function __construct(array $pluginMap) {
$this->_pluginMap = $pluginMap;
}
public function routeShutdown(Zend_Controller_Request_Abstract $request) {
$module = $request->getModuleName();
if(isset($this->_pluginMap[$module])) {
$front = Zend_Controller_Front::getInstance();
foreach($this->_pluginMap[$module] as $plugin) {
$front->registerPlugin(new $plugin());
}
}
}
}
classMap をコンストラクターに渡す必要があるため、このプラグインを明示的にインスタンス化して、application.ini の行ではなくフロント コントローラーに登録する必要があります。
public function _initPluginLoader() {
$front = Zend_Controller_Front::getInstance();
$front->registerPlugin(new BaseTen_Controller_Plugin_ModulePluginLoader(array(
'default' => array(
'Plugin_Foo',
'Plugin_Bar',
...
),
'foo' => array(
'Foo_Plugin_Foo',
'Foo_Plugin_Bar',
...
)
)));
}
プラグインを実行できる最も早い時期はrouteShutdown
です。そうしないと、アクティブなモジュールがわかりません。ただし、これが意味することは、このメソッドを使用して登録された他のプラグインは、それdispatchLoopStartup
以降のみ実行できるということです。ほとんどの場合、私たちはおそらくpreDispatch
andpostDispatch
フックに関心がありますが、覚えておく価値があります。