Zend Framework — Zend_Loader_PluginLoader

#php #zend-framework

#php #zend-framework

Вопрос:

Я действительно только начинаю с Zend Framework, и в настоящее время у меня проблема с 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(), и код в обоих случаях одинаковы, в чем разница?

Как мне заставить его распознавать мои плагины на уровне приложения?

Комментарии:

1. И где My_Plugin_ModuleConfigLoaderPlugin расположить?

Ответ №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"