我正在使用模块构建一个多站点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方法的顶部检查一下吗?
或者,我是否应该只为我要求的网站添加模块,因此只会加载两个Bootstrap.php文件?
如果我从我的application.ini中删除resources.modules[] = ""
,并在我的主Bootstrap.php中使用以下代码添加模块,它似乎添加了控制器,但实际上并没有触发位于其中的Bootstrap.php模块?
$frontController = $this->getResource('frontController');
$frontController->addControllerDirectory(APPLICATION_PATH . '/modules/site1/controllers', 'site1');
答案 0 :(得分:3)
见Matthew Weier O'Phinney的帖子:
Module Bootstraps in Zend Framework: Do's and Don'ts
特别要注意的是,他建议在路由完成后触发前控制器插件,检查正确的模块,否则提前保释。
答案 1 :(得分:1)
引导程序的目的是初始化应用程序。因此,所有模块bootstraps将始终在每个请求上与主应用程序一起初始化。如果要根据加载的模块执行操作,最简单的方法是在控制器插件中。在插件中,您可以检查当前模块是什么,然后运行您需要的内容。
或者,您可以在应用程序引导程序中手动添加单个模块,而不是在配置中添加resources.modules[] = ""
行(它将自动扫描添加所有模块的模块目录)。这将允许您只添加核心和与正在查看的任何站点相关的路径。我不确定这是否适合设计的模块。
您还需要手动触发模块引导:
require_once APPLICATION_PATH.'/modules/site1/Bootstrap.php';
$className = 'Site1_Bootstrap';
$moduleBootstrap = new $className($this);
$moduleBootstrap->bootstrap();
答案 2 :(得分:0)
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;
}