【问题标题】:Zend Framework - Modules - Only Bootstrap Current ModuleZend 框架 - 模块 - 仅引导当前模块
【发布时间】:2012-02-29 16:20:07
【问题描述】:

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

每个模块都扩展核心模块。

我的模块中有以下内容:

resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.modules[] = ""

Boostrap /application/modules/core/bootstrap.php/application/modules/xxx/bootstrap.php 的最佳方法是什么,其中“xxx”是正在加载的模块的名称?

我可以在每个 Bootstrap 方法的顶部进行检查吗?

或者,我是否应该只为我在 Core 旁边请求的站点添加模块,因此只会加载两个 Bootstrap.php 文件?

编辑

如果我从 application.ini 中删除 resources.modules[] = "",并在我的主 Bootstrap.php 中使用以下代码添加模块,它似乎添加了控制器,但实际上并未触发位于模块中的 Bootstrap.php ?

$frontController = $this->getResource('frontController');
$frontController->addControllerDirectory(APPLICATION_PATH . '/modules/site1/controllers', 'site1');

【问题讨论】:

  • this post by MWOP。特别要注意的是,他建议在路由完成后触发前端控制器插件,检查正确的模块,否则尽早退出。
  • 大卫,你能把这个作为这个问题的附加答案吗?
  • @Sjwdavies:我还需要每个站点扩展的核心模块,就像您的示例一样。您是如何路由到正确的站点文件夹的?

标签: zend-framework


【解决方案1】:

查看 Matthew Weier O'Phinney 的帖子:

Module Bootstraps in Zend Framework: Do's and Don'ts

特别注意,他建议在路由完成后触发的前端控制器插件,检查正确的模块,否则尽早退出。

【讨论】:

  • 这绝对是最好的答案。相反,我根据您答案中的链接创建了单独的 FrontController 插件 - 每个模块一个,它们都包含在 Bootstrap.ini 中。这些将引领 MWOP 所说的 Facade 模式自定义加载。我特别喜欢那篇帖子中的这句话To re-iterate: if you have initialization tasks that should only be done if the module is the one being executed, do it in a front controller plugin or action helper.
  • 是的,这篇文章对我的基于模块的应用程序帮助很大。谢谢。
  • ...帖子不见了。这就是为什么只链接到另一个页面确实不是一个好主意,将答案放在这里以供后代使用。
  • 这就是我添加一般结果的原因 - 使用引导后触发的前端控制器插件。但是你的观点很好。更详细的总结会更好。更新了我通过 Google 搜索找到的链接。
【解决方案2】:

引导程序的目的是初始化应用程序。因此,all 模块引导程序将始终在每次请求时与主应用程序一起初始化。如果要根据加载的模块执行操作,最简单的方法是在控制器插件中。在插件中,您可以检查当前模块是什么,然后运行您需要的。

或者,您可以在应用程序引导程序中手动添加单个模块,而不是在配置中添加 resources.modules[] = "" 行(这将自动扫描模块目录并添加所有模块)。这将允许您只添加核心和与正在查看的任何站点相关的路径。我不确定这是否适合设计的模块。

您还需要手动启动模块引导程序:

require_once APPLICATION_PATH.'/modules/site1/Bootstrap.php';
$className = 'Site1_Bootstrap';
$moduleBootstrap = new $className($this);
$moduleBootstrap->bootstrap();

【讨论】:

  • 谢谢蒂姆。使用它的原因之一是检查用户是否已登录。我考虑过使用控制器插件的想法,但认为最好仅加载相关的引导文件并将此方法移至此处,以防万一。
  • 检查用户是否登录在控制器插件中肯定比在引导程序中更好。在插件中,您可以更改请求参数(例如将用户发送到登录页面)。
  • 用模块引导程序的一些代码更新了我的答案。
  • 谢谢蒂姆。我创建了一个“检查模块/类/动作”是否存在插件,如果请求的模块/控制器/动作不存在,该插件类似于将请求和调度模块值设置为适当的模块。我认为在这种情况下我可能最好使用控制器插件。但是,我仍然希望能够在 application.ini 中指定单个模块,然后加载所需的模块引导程序..
  • 谢谢蒂姆。我在我的 Bootstrap.php 中的 _initFrontModules() 方法中使用了您的脚本。我觉得以这种方式使用 Bootstrapper 很脏 TBH。另外,需要注意的是,使用上述方法会在主 application/bootstrap.php 之前触发“子加载”模块 Bootstrap.php
【解决方案3】:
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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    相关资源
    最近更新 更多