Динамический модуль по умолчанию в Zend Framework

Кто-нибудь знает, как динамически установить модуль по умолчанию в Zend Framework и избежать проблем с пространством имен? Например, я хочу иметь таблицу модулей, которым разрешено загружать, причем один из них установлен как модуль по умолчанию. Например, у меня может быть:

admin
blog
calendar

как модули, которые можно загрузить. Если у меня в качестве модуля по умолчанию используется «блог», тогда «администратор» и «календарь» должны иметь свои контроллеры в пространстве имен (Admin_IndexController, Calendar_IndexController), а «блог» - нет (IndexController).

Если я изменю «календарь» на модуль по умолчанию, ZF больше не сможет находить классы из-за пространства имен.

Как это обойти? В настоящее время я использую следующий код:

$modules = new Modules();
$activeModules = $modules->fetchActive();
foreach($activeModules as $mod) {
    $loadedModules[$mod->name] = '..application/modules/' . $mod->name . '/controllers';
    if($mod->default) {
        $defaultModule = $mod->name;
    }
}
$frontController->setControllerDirectory($loadedModules);
$frontController->setDefaultModule($defaultModule);

person dragonmantank    schedule 17.05.2009    source источник


Ответы (4)


Если вы планируете изменить модуль по умолчанию, вероятно, лучше всего указать пространство имен ВСЕ модули, а затем указать, что модуль по умолчанию должен иметь префикс:

Сначала измените модуль «блог», чтобы использовать пространство имен:

<?php

// Used to be "class IndexController"
class Blog_IndexController extends Zend_Controller_Action {

}

Затем вызовите setParam для параметра prefixDefaultModule в вашем экземпляре Zend_Controller_Front:

<?php

    // Allow your default module to be prefixed
    $frontController->setParam('prefixDefaultModule', true);

См. Объяснение в ошибке № 1831.

person Jake McGraw    schedule 18.05.2009

используйте application.ini: resources.frontController.prefixDefaultModule = true resources.frontController.defaultModule = default

person Sel    schedule 19.05.2010

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

По крайней мере, так мы это реализовали;)

person xelurg    schedule 18.05.2009

Похоже на работу плагина preDispatch Controller.

Вы можете изменить запрос на изменение модуля на основе определенного запроса или идентификатора / сеанса / известных данных для пересылки или перенаправления по запросу.

person David Snabel-Caunt    schedule 18.05.2009