Zend Framework: автозагрузка ресурсов модуля в config.ini?
Возможно ли настроить следующее поведение в application.ini?
<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
protected function _initAdminModuleAutoloader()
{
$this->_resourceLoader = new Zend_Application_Module_Autoloader(array(
'namespace' => 'Admin',
'basePath' => APPLICATION_PATH . '/modules/admin',
));
$this->_resourceLoader->addResourceTypes(array(
'model' => array(
'namespace' => 'Model',
'path' => 'models'
)
));
}
}
?>
Если да, не могли бы вы показать нам пример?
Благодарю.
2 ответа
Вот пара указателей. Во-первых, вы должны иметь следующую строку в файле application.ini.
resources.modules.admin = "enabled"
Это обеспечит выполнение следующей функции в Zend_Application_Resource_Modules
public function init()
{
$bootstrap = $this->getBootstrap();
$bootstrap->bootstrap('FrontController');
$front = $bootstrap->getResource('FrontController');
$modules = $front->getControllerDirectory();
$default = $front->getDefaultModule();
$curBootstrapClass = get_class($bootstrap);
foreach ($modules as $module => $moduleDirectory) {
$bootstrapClass = $this->_formatModuleName($module) . '_Bootstrap';
if (!class_exists($bootstrapClass, false)) {
$bootstrapPath = dirname($moduleDirectory) . '/Bootstrap.php';
if (file_exists($bootstrapPath)) {
$eMsgTpl = 'Bootstrap file found for module "%s" but bootstrap class "%s" not found';
include_once $bootstrapPath;
if (($default != $module)
&& !class_exists($bootstrapClass, false)
) {
throw new Zend_Application_Resource_Exception(sprintf(
$eMsgTpl, $module, $bootstrapClass
));
} elseif ($default == $module) {
if (!class_exists($bootstrapClass, false)) {
$bootstrapClass = 'Bootstrap';
if (!class_exists($bootstrapClass, false)) {
throw new Zend_Application_Resource_Exception(sprintf(
$eMsgTpl, $module, $bootstrapClass
));
}
}
}
} else {
continue;
}
}
if ($bootstrapClass == $curBootstrapClass) {
// If the found bootstrap class matches the one calling this
// resource, don't re-execute.
continue;
}
$moduleBootstrap = new $bootstrapClass($bootstrap);
$moduleBootstrap->bootstrap();
$this->_bootstraps[$module] = $moduleBootstrap;
}
return $this->_bootstraps;
}
В приведенной выше функции вызывается загрузчик вашего модуля. Вам нужно иметь файл начальной загрузки модуля в /application/modules/admin с именем Bootstrap.php со следующим кодом:
class Admin_Bootstrap extends Zend_Application_Module_Bootstrap
{
}
Я собираюсь пропустить несколько шагов, но если вы проследите через классы наследования, это приведет к вызову следующей функции в Zend_Application_Module_Autoloader
public function initDefaultResourceTypes()
{
$basePath = $this->getBasePath();
$this->addResourceTypes(array(
'dbtable' => array(
'namespace' => 'Model_DbTable',
'path' => 'models/DbTable',
),
'mappers' => array(
'namespace' => 'Model_Mapper',
'path' => 'models/mappers',
),
'form' => array(
'namespace' => 'Form',
'path' => 'forms',
),
'model' => array(
'namespace' => 'Model',
'path' => 'models',
),
'plugin' => array(
'namespace' => 'Plugin',
'path' => 'plugins',
),
'service' => array(
'namespace' => 'Service',
'path' => 'services',
),
'viewhelper' => array(
'namespace' => 'View_Helper',
'path' => 'views/helpers',
),
'viewfilter' => array(
'namespace' => 'View_Filter',
'path' => 'views/filters',
),
));
$this->setDefaultResourceType('model');
}
Все вышеперечисленные типы ресурсов будут охватываться по умолчанию для каждого модуля, для которого вы следуете этому шаблону. Любые другие, которые вам нужны, должны быть настроены в файле начальной загрузки.
Я использую Zend Framework версии 1.10.4 с конфигурацией проекта по умолчанию. Я активирую все Модули в моем application.ini следующей строкой:
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
Важно, чтобы у вас был Bootstrap.php в каталоге вашего модуля. Без этого мои модели не были загружены правильно. URL в вашем браузере чувствителен к регистру. Например: http://example.com/Admin/controller/action
Итак, это должно работать...