我正在使用模块构建一个多站点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[] = ""引导/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');发布于 2012-03-02 20:26:37
看看Matthew Weier‘’Phinney的帖子:
Module Bootstraps in Zend Framework: Do's and Don'ts
特别要注意的是,他推荐在路由完成后触发的前端控制器插件,检查正确的模块,否则提早退出。
发布于 2012-03-01 00:28:15
bootstrap的目的是初始化应用程序。因此,所有模块引导将始终在每次请求时初始化,主应用程序也是如此。如果要根据加载的模块执行操作,最简单的方法是在控制器插件中执行。在插件中,你可以查看当前的模块,然后运行你需要的。
或者,您可以在应用程序引导程序中手动添加单个模块,而不是在配置中添加resources.modules[] = ""行(这将自动扫描添加所有模块的模块目录)。这将允许您仅添加与正在查看的任何站点相关的核心站点和路径。不过,我不确定这是否适合模块的设计。
您还需要手动启动模块引导程序:
require_once APPLICATION_PATH.'/modules/site1/Bootstrap.php';
$className = 'Site1_Bootstrap';
$moduleBootstrap = new $className($this);
$moduleBootstrap->bootstrap();发布于 2013-12-23 20:44:57
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;
}https://stackoverflow.com/questions/9502762
复制相似问题