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

}
?>

Если да, не могли бы вы показать нам пример?

Спасибо.


comment
Был ли пример полезен? Вы видели это?   -  person Travis    schedule 15.03.2010
comment
есть тот же вопрос. Трэвис, твой ответ не отвечает на вопрос.   -  person sanders    schedule 05.08.2010


Ответы (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');
}

Все вышеперечисленные типы ресурсов будут включены по умолчанию для каждого модуля, для которого вы следуете этому шаблону. Любые другие, которые вам нужны, должны быть настроены в файле начальной загрузки.

person Travis    schedule 13.03.2010
comment
Спасибо, Трэвис. Это хороший подход! Я думал о чем-то более простом, например: resources.frontcontroller.namespaces.viewfilter.ns = View_Filter resources.frontcontroller.namespaces.viewfilter.path = views/filters Я полагаю, что такая конфигурация пока недоступна для Zend_Application. Может в ближайшем будущем.... - person olagato; 16.03.2010
comment
Ну, это довольно просто. Вам нужна только строка resources.modules.admin = enabled и пустой файл начальной загрузки. Zend_Application позаботится обо всем остальном за вас. Я просто отслеживал для вас реальный код Zend, который настраивает это по умолчанию. - person Travis; 16.03.2010

Я использую Zend Framework версии 1.10.4 с конфигурацией проекта по умолчанию. Я активирую все модули в своем application.ini следующей строкой:

resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"

Важно, чтобы у вас был Bootstrap.php в каталоге вашего модуля. Без этого мои модели загружались неправильно. URL-адрес в вашем браузере чувствителен к регистру. Например: http://example.com/Admin/controller/action

Значит, должно работать...

person micha149    schedule 01.05.2010