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

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

admin blog calendar 

как модули, которые можно загрузить. Если у меня есть «блог» в качестве модуля по умолчанию, тогда «admin» и «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); 

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

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

 <?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 для объяснения.

use application.ini: resources.frontController.prefixDefaultModule = true resources.frontController.defaultModule = default

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

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

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

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