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',
            ...
        )
    )));
}