#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"