Я знаю, что это старый вопрос, но это всегда меня беспокоило.Я не знаю, сделал ли 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());
}
}
}
}
Поскольку нам нужно передать classMap вконструктор, нам нужно создать экземпляр и зарегистрировать этот плагин с помощью Front Controller, а не с помощью строки в 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
крючках, но о них стоит помнить.