我知道這是一個古老的問題,但這總是困擾着我。我不知道ZF 2是否做了什麼來解決它(我還沒有機會玩它),但我寫了一個插件加載器插件來處理這個ZF 1!
問題是,即使在設置模塊自動加載器並將插件保存在模塊的插件文件夾中時,它也只會設置自動加載(無論如何都是交叉模塊),而不是註冊。這意味着你可以在你的application.ini行實例化的插件,但它會自動載入,併爲每個模塊註冊。
無論如何,這裏有一個可能的解決方案來確保模塊插件僅註冊到活動模塊。或者,您可以循環訪問模塊插件目錄中的所有文件,而不是提供類映射,但這會感覺很難受,並且可能很慢。
<?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());
}
}
}
}
因爲我們需要一個類映射傳遞給構造函數,我們需要顯式實例化,並與一的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
和postDispatch
掛鉤感興趣,但值得注意。