【问题标题】:Zend Framework - Zend_Loader_PluginLoaderZend 框架 - Zend_Loader_PluginLoader
【发布时间】:2026-02-13 01:50:01
【问题描述】:

我才真正开始使用 Zend 框架,目前我遇到了 Zend_Loader_PluginLoader 的问题。

我设法使用以下代码让一个特定于模块的插件足够轻松地工作:

class Api_Bootstrap extends Zend_Application_Module_Bootstrap
{
    protected function _initPlugins()
    {
        $loader = new Zend_Loader_PluginLoader(array(
            'Api_Plugin' => 'application/modules/api/plugins',
        ));

        $front = Zend_Controller_Front::getInstance();
        $front->registerPlugin(new Api_Plugin_ErrorControllerSelectorPlugin());
    }
}

编辑:类文件位于application/modules/api/plugins/ErrorControllerSelectorPlugin.php

然后我尝试对此进行调整以使用以下方法为整个应用程序加载插件:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initAppAutoload()
    {
        $autoloader = new Zend_Application_Module_Autoloader(array(
            'namespace' => 'App',
            'basePath' => dirname(__FILE__),
        ));

        return $autoloader;
    }

    protected function _initPlugins()
    {
        $loader = new Zend_Loader_PluginLoader(array(
            'My_Plugin' => 'application/plugins',
        ));

        $front = Zend_Controller_Front::getInstance();
        $front->registerPlugin(new My_Plugin_ModuleConfigLoaderPlugin());
    }
}

但我遇到了错误:

Fatal error: Class 'My_Plugin_ModuleConfigLoaderPlugin' not found in /var/www/localhost/application/Bootstrap.php on line 22

编辑:类文件位于application/plugins/ModuleConfigLoaderPlugin.php

所以 - 由于文件是我希望它们位于发送到 Zend_Loader_PluginLoader() 的前缀/路径对的位置,并且两种情况下的代码相同,有什么区别?

如何让它识别我的应用级插件?

【问题讨论】:

  • My_Plugin_ModuleConfigLoaderPlugin 在哪里定位?

标签: php zend-framework


【解决方案1】:

如果您希望应用级插件驻留在命名空间My_ 中,则需要将My 文件夹放在库文件夹中,或者将应用级命名空间声明为My_

假设您的*应用程序中已经有其他使用 App_ 命名空间的东西,那么最简单的方法就是前者:将您的 My 文件夹移到 library 中。

因此,插件将驻留在:

library/My/Plugins/ModuleConfigLoaderPlugin.php

然后确保您的 configs/application.ini 注册了 My_ 命名空间:

autoloaderNamespaces[] = "My_"

那么应用级别的Bootstrap 可能包含如下内容:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initAppAutoload()
    {
        $autoloader = new Zend_Application_Module_Autoloader(array(
            'namespace' => 'App',
            'basePath' => dirname(__FILE__),
        ));

        return $autoloader;
    }

    protected function _initPlugins()
    {
        $front = Zend_Controller_Front::getInstance();
        $front->registerPlugin(new My_Plugin_ModuleConfigLoaderPlugin());
    }
}

或者,由于您的插件不需要任何参数,您可以通过configs/application.ini 使用以下方法对其进行实例化:

resources.frontcontroller.plugins[] = "My_Plugin_ModuleConfigLoaderPlugin"

【讨论】: