Zend framework 如何加载带有模块的插件
我在Zend framework 如何加载带有模块的插件,zend-framework,plugins,load,bootstrapping,Zend Framework,Plugins,Load,Bootstrapping,我在plugins目录下的admin模块目录中有这个插件。因此,它位于application/modules/admin/plugins/LayoutPlugin.php: <?php class LayoutPlugin extends Zend_Controller_Plugin_Abstract { public function preDispatch(Zend_Controller_Request_Abstract $request) { $layout
plugins
目录下的admin模块目录中有这个插件。因此,它位于application/modules/admin/plugins/LayoutPlugin.php
:
<?php
class LayoutPlugin extends Zend_Controller_Plugin_Abstract
{
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
$layout = Zend_Layout::getMvcInstance();
$view = $layout->getView();
$view->whatever = 'foo';
}
}
模块引导默认设置模块自动加载程序,因此如果将类重命名为Admin\u Plugin\u LayoutPlugin,ZF应该能够找到它
请记住,无论您是否在管理模块中,管理引导(与所有引导一样)都将运行,因此,如果您打算为管理员页面分配一些额外的变量,那么在注册插件之前,您需要确保管理员是当前模块。我知道这是一个老问题,但这一直是困扰我的问题。我不知道ZF2是否做了任何事情来解决它(我还没有机会玩它),但我为ZF1编写了一个插件加载器插件来处理这个问题
当然,问题是,即使在设置模块自动加载程序并将插件保存在模块的插件文件夹中时,这只会设置自动加载(无论如何,这是跨模块的),而不会进行注册。这意味着您可以在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());
}
}
}
}
插件最早可以在routeShutdown
运行,否则我们将无法知道活动模块。这意味着使用此方法注册的任何其他插件只能从dispatchLoopStartup
开始运行。大多数情况下,我们可能对preDispatch
和postDispatch
挂钩感兴趣,但值得记住
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',
...
)
)));
}