Zend framework Zend Framework-模块-仅引导当前模块

Zend framework Zend Framework-模块-仅引导当前模块,zend-framework,Zend Framework,我正在使用模块构建一个多站点Zend Framework应用程序,大致采用以下结构: |Project |-Application |-configs |-modules |-core |-controllers |-models |-views |-Bootstrap.php |-

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

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

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

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

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

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

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

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

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

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

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

见Matthew Weier O'Phinney的帖子:


特别要注意的是,他建议在布线完成后启动前端控制器插件,检查模块是否正确,否则应尽早退出。

请参阅Matthew Weier O'Phinney的帖子:

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

特别要注意的是,他建议在布线完成后启动前端控制器插件,检查模块是否正确,否则应尽早退出。

谢谢Tim。使用此选项的原因之一是检查用户是否已登录。我考虑过使用控制器插件的想法,但认为最好是在将来的校对中只加载相关的引导文件,并将此方法移到此处。检查用户是否登录听上去控制器插件比引导更好。例如,在插件中,您可以更改请求参数以将用户发送到登录页面。还使用一些模块引导代码更新了我的答案。谢谢Tim。我创建了一个“检查模块/类/动作是否存在”插件,它的作用类似于在请求的模块/控制器/动作不存在时将请求和分派模块值设置到相应的模块。我想在这个场合,我最好使用一个控制器插件。但是,我仍然希望能够在application.ini中指定单个模块,然后加载所需的模块引导..谢谢Tim。我在Bootstrap.php中的_initFrontModules方法中使用了您的脚本。我用这种方式使用引导程序感觉很脏。另外,需要注意的一点是,使用上述方法会在主应用程序/Bootstrap.phpThanks之前启动“子加载”模块Bootstrap.php。使用此选项的原因之一是检查用户是否已登录。我考虑过使用控制器插件的想法,但认为最好是在将来的校对中只加载相关的引导文件,并将此方法移到此处。检查用户是否登录听上去控制器插件比引导更好。例如,在插件中,您可以更改请求参数以将用户发送到登录页面。还使用一些模块引导代码更新了我的答案。谢谢Tim。我已经创建了一个“检查是否存在模块/类/操作”插件,它的作用类似于设置请求,并在请求满足时将模块值分派给相应的模块
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;
}

ted模块/控制器/操作不存在。我想在这个场合,我最好使用一个控制器插件。但是,我仍然希望能够在application.ini中指定单个模块,然后加载所需的模块引导..谢谢Tim。我在Bootstrap.php中的_initFrontModules方法中使用了您的脚本。我用这种方式使用引导程序感觉很脏。另外,需要注意的一点是,使用上述方法在主应用程序/Bootstrap.phpSee之前触发“子加载”模块Bootstrap.php。特别要注意的是,他建议在完成路由后启动前端控制器插件,检查是否有正确的模块,否则请尽早退出。大卫,请你将此作为这个问题的补充答案发布出来?@Sjwdavies:我还需要每个站点扩展的核心模块,就像你的例子一样。如何路由到正确的站点文件夹?请参阅。特别要注意的是,他建议在完成路由后启动前端控制器插件,检查是否有正确的模块,否则请尽早退出。大卫,请你将此作为这个问题的补充答案发布出来?@Sjwdavies:我还需要每个站点扩展的核心模块,就像你的例子一样。您是如何路由到正确的站点文件夹的?这绝对是最好的答案。相反,根据您答案中的链接,我创建了单独的FrontController插件-每个模块一个,它们都包含在Bootstrap.ini中。这些将引领MWOP所说的定制加载立面模式。我特别喜欢那篇文章中的这句话来重复:如果你有初始化任务,而这些任务只有在模块被执行的情况下才能完成,那么就在前端控制器插件或动作助手中完成。!是的,那篇文章对我基于模块的应用程序帮助很大。谢谢……邮件也不见了。这就是为什么仅仅链接到另一个页面并不是一个好主意,把答案放在这里以供子孙后代参考。这就是为什么我添加了一般的结果-使用引导后启动的前端控制器插件。但是你的观点被很好地理解了。更详细的总结会更好。更新了我用谷歌搜索找到的链接。这绝对是最好的答案。相反,根据您答案中的链接,我创建了单独的FrontController插件-每个模块一个,它们都包含在Bootstrap.ini中。这些将引领MWOP所说的定制加载立面模式。我特别喜欢那篇文章中的这句话来重复:如果你有初始化任务,而这些任务只有在模块被执行的情况下才能完成,那么就在前端控制器插件或动作助手中完成。!是的,那篇文章对我基于模块的应用程序帮助很大。谢谢……邮件也不见了。这就是为什么仅仅链接到另一个页面并不是一个好主意,把答案放在这里以供子孙后代参考。这就是为什么我添加了一般的结果-使用引导后启动的前端控制器插件。但是你的观点被很好地理解了。更详细的总结会更好。更新了我用谷歌搜索找到的链接。