Zend Framework - 模块 - 仅限Bootstrap当前模块

时间:2012-02-29 16:20:08

标签: zend-framework

我正在使用模块构建一个多站点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');

3 个答案:

答案 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;
}