Zend Framework - Модули - Только текущий модуль начальной загрузки - PullRequest
2 голосов
/ 29 февраля 2012

Я создаю многосайтовое приложение Zend Framework с использованием модулей, вроде следующей структуры:

|Project
    |-Application
        |-configs
        |-modules
            |-core
                |-controllers
                |-models
                |-views
                |-Bootstrap.php
            |-site1
                |-controllers
                |-models
                |-views
                |-Bootstrap.php
            |-site2
            |-site3
        |-Bootstrap.php
    |-Docs
    |-Library
    |-Public
    |-.zfproject.xml

Каждый модуль расширяет модуль Core.

У меня есть следующее вмой модуль:

resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.modules[] = ""

Какой самый лучший способ Boostrap /application/modules/core/bootstrap.php и /application/modules/xxx/bootstrap.php, где 'xxx' - это имя загружаемого модуля?

Я мог бы сделать это спроверять в начале каждого метода Bootstrap?

Или я должен добавить модуль только для сайта, который я запрашиваю, вместе с Core, и, таким образом, будут загружены только два файла Bootstrap.php?

РЕДАКТИРОВАТЬ

Если я удаляю resources.modules[] = "" из моего application.ini и использую следующий код в моем основном Bootstrap.php для добавления модуля, кажется, что он добавляет контроллеры, но фактически не запускаетсяBootstrap.php, расположенный внутри модуля?

$frontController = $this->getResource('frontController');
$frontController->addControllerDirectory(APPLICATION_PATH . '/modules/site1/controllers', 'site1');

Ответы [ 3 ]

3 голосов
/ 02 марта 2012

Смотрите пост Мэтью Вейера О'Финни:

Модуль начальной загрузки в Zend Framework: что нужно и чего не нужно

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

1 голос
/ 29 февраля 2012

Целью начальной загрузки является инициализация приложения.Поэтому все загрузочные модули модуля всегда будут инициализироваться при каждом запросе, наряду с основным приложением.Если вы хотите выполнить операцию в зависимости от загруженного модуля, самый простой способ сделать это - в плагине контроллера.Внутри плагина вы можете проверить, что является текущим модулем, а затем запустить то, что вам нужно.

В качестве альтернативы, вместо добавления строки resources.modules[] = "" в конфигурации (которая автоматически просканирует каталог модулей, добавив всемодули), вы можете вручную добавить отдельные модули в загрузочный пакет приложения.Это позволит вам добавить только основной и путь, связанный с тем, какой сайт просматривается.Я не уверен, подходит ли это для того, для чего были разработаны модули.

Вам также нужно запускать загрузчики модулей вручную:

require_once APPLICATION_PATH.'/modules/site1/Bootstrap.php';
$className = 'Site1_Bootstrap';
$moduleBootstrap = new $className($this);
$moduleBootstrap->bootstrap();
0 голосов
/ 23 декабря 2013
protected function _initAutoload(){

    $front = Zend_Controller_Front::getInstance();
    $front->setControllerDirectory(array( 'Default' => APPLICATION_PATH.'/modules/default/controllers', 'Other' => APPLICATION_PATH.'/modules/other/controllers' ));
    $front->setParam('useDefaultControllerAlways', true);
    $modules = $front->getControllerDirectory();
    $default = $front->getDefaultModule();

    $router = new Zend_Controller_Router_Rewrite();
    $request =  new Zend_Controller_Request_Http();
    $router->route($request);
    $current_module = ucfirst($request->getModuleName());

    foreach (array_keys($modules) as $module) {

        if ($module == $current_module) {
            $modelLoader = new Zend_Application_Module_Autoloader(array( 'namespace' => $module, 'basePath'  => $front->getModuleDirectory($module)));

            require_once $front->getModuleDirectory($module).'/Bootstrap.php';
            $className = $module.'_Bootstrap';
            $moduleBootstrap = new $className($this);
            $moduleBootstrap->bootstrap();
        }
    }

    return $modelLoader;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...