thinkphp配置配置多应用多配置的方法

发布时间 - 2020-05-07 00:00:00    点击率:



多模块

在 ThinkPHP 3.2.3 中,默认的应用目录是 ./Application,下面的默认模块是 Home 模块,如果此时需要添加一个 Admin 模块用于后台应用,在默认的入口文件 ./index.php 中添加:

// 绑定Admin模块到当前入口文件
define('BIND_MODULE','Admin');

此时运行 http://serverNmae/index.php,会在 ./Application 目录下生成一个 Admin 模块。但是此时访问 http://serverName/index.php,实际上访问的是新添加的 Admin 模块,即使在 ./Applicaition/Common/Conf/config.php 中添加

//设置默认模块
'DEFAULT_MODULE'    =>  'Home'

也无法正确定位到 Home 模块。

实际上手册中提到到的在入口文件定义 BIND_MODULE 的实际含义是定义默认模块。参见:./ThinkPHP/Library/Think/Dispatcher.calss.php,该文件定义了 ThinkPHP 内置的 Dispatcher 类,用于完成 URL 解析、路由和调度(参见手册中的 ”系统流程“ 一节),其中 Line:140

// 获取模块名称
define('MODULE_NAME', defined('BIND_MODULE')? BIND_MODULE : self::getModule($varModule));

在静态方法 dispatch 中,模块名称的获取首先会在入口文件中查询是否有定义 BIND_MODULE,如果有定义,则定义 MODULE_NAME 的值为定义的 BIND_MODULE 的值,否则调用该类中的静态私有方法 getModule 来获取实际的模块名称:

/**
     * 获得实际的模块名称
     */
    static private function getModule($var) {
        $module   = (!empty($_GET[$var])?$_GET[$var]:C('DEFAULT_MODULE'));
        unset($_GET[$var]);
        if($maps = C('URL_MODULE_MAP')) {
            if(isset($maps[strtolower($module)])) {
                // 记录当前别名
                define('MODULE_ALIAS',strtolower($module));
                // 获取实际的模块名
                return   ucfirst($maps[MODULE_ALIAS]);
            }elseif(array_search(strtolower($module),$maps)){
                // 禁止访问原始模块
                return   '';
            }
        }
        return strip_tags(ucfirst(strtolower($module)));
    }

该方法中,如果 URL 中不包含配置文件重定义的 VAR_MODULE (默认为 m,在 ./ThinkPHP/Conf/convention.php 中)的值,则找配置文件中定义的 DEFAULT_MODULE 的值。

通过以上分析,得出 BIND_MODULE 实际上是定义默认模块,如果在项目中有多个模块的话,不要这样配置。

如果此时注释默认入口文件 ./index.php 中的 BIND_MODULE(即采用默认的入口文件配置),那么直接访问 http://serverName/admin 就可以访问 Admin 模块,因为在该入口文件中,定义了应用目录 ./Application,那么访问 http://serverName/admin 实际就是访问了 ./Application/Admin/Controller/IndexController.class.php 中的 index 方法。

ThinkPHP 3.2.3 采用这种方式配置多模块就可以了,无需在入口文件和配置文件中另作定义,这也是 ThinkPHP 官方推荐的分组模式。

另外一种配置就是多入口设计,即在默认入口文件 index.php 的同级创建 admin.php ,同时在 index.php 中添加:

// 绑定Home模块到当前入口文件
define('BIND_MODULE','Home');

在 admin.php 中采用和 index.php 相同的配置,除了 BIND_MODULE 的定义,将 BIND_MODULE 的定义改为:

// 绑定Admin模块到当前入口文件
define('BIND_MODULE','Admin');

然后在应用配置文件 ./Application/Common/Conf/config.php 中添加:

//设置默认模块
'DEFAULT_MODULE'    =>  'Home',

此时访问 http://serverName/index.php 就能访问 Home 模块,访问 http://servername/admin.php ,就能访问 Admin 模块,而无法访问 http://serverName/admin ,因为此时 index.php 只能访问 Home 模块。

多应用 

通常情况下 ThinkPHP 3.2.3 无需使用多应用模式,因为大多数情况下都可以通过多模块化以及多入口的设计来解决应用的扩展需求。

如果一定要使用多应用模式,例如创建应用 Application_API,那么可以在 ./Application 同级目录下创建目录 Applicaiton_API,同时增加入口文件 ./api.php,将应用目录指向 ./Application_API:

// 定义应用目录
define('APP_PATH','./Application_API/');

注意初始情况下新增加的应用一定要有 Home 模块,即使在 ./Application_API/Common/Conf/config.php 中设置了

//设置默认模块
'DEFAULT_MODULE'    =>  'Api',

也许要初始有 Home 模块,否则会报错:无法加载 Index 控制器。

推荐教程:《TP5》


# thinkphp  # 配置文件  # 绑定  # 就能  # 会在  # 情况下  # 就可以  # 的是  # 多模  # 目录下  # 多个 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】  javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】  ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  海南网站制作公司有哪些,海口网是哪家的?  新三国志曹操传主线渭水交兵攻略  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  再谈Python中的字符串与字符编码(推荐)  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  怎么用AI帮你设计一套个性化的手机App图标?  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  在centOS 7安装mysql 5.7的详细教程  如何用y主机助手快速搭建网站?  如何在Windows 2008云服务器安全搭建网站?  EditPlus中的正则表达式 实战(4)  Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试  百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  Laravel Docker环境搭建教程_Laravel Sail使用指南  JavaScript模板引擎Template.js使用详解  如何在IIS中新建站点并配置端口与物理路径?  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  nodejs redis 发布订阅机制封装实现方法及实例代码  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  如何快速查询网站的真实建站时间?  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  网站优化排名时,需要考虑哪些问题呢?  非常酷的网站设计制作软件,酷培ai教育官方网站?  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  如何在IIS服务器上快速部署高效网站?  如何破解联通资金短缺导致的基站建设难题?  Bootstrap整体框架之CSS12栅格系统  Laravel中的withCount方法怎么高效统计关联模型数量  如何基于云服务器快速搭建网站及云盘系统?  如何在宝塔面板创建新站点?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  Laravel如何配置任务调度?(Cron Job示例)  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  如何快速配置高效服务器建站软件?  java获取注册ip实例