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


相关推荐: JS经典正则表达式笔试题汇总  夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化  网站制作企业,网站的banner和导航栏是指什么?  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  如何用景安虚拟主机手机版绑定域名建站?  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  如何基于PHP生成高效IDC网络公司建站源码?  如何在阿里云完成域名注册与建站?  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  如何快速选择适合个人网站的云服务器配置?  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  EditPlus中的正则表达式 实战(4)  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  EditPlus中的正则表达式实战(6)  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  高性能网站服务器配置指南:安全稳定与高效建站核心方案  Android自定义listview布局实现上拉加载下拉刷新功能  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  非常酷的网站设计制作软件,酷培ai教育官方网站?  千库网官网入口推荐 千库网设计创意平台入口  香港服务器WordPress建站指南:SEO优化与高效部署策略  如何确保FTP站点访问权限与数据传输安全?  如何快速生成凡客建站的专业级图册?  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  linux写shell需要注意的问题(必看)  Android 常见的图片加载框架详细介绍  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  如何快速生成橙子建站落地页链接?  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  创业网站制作流程,创业网站可靠吗?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  大同网页,大同瑞慈医院官网?  如何利用DOS批处理实现定时关机操作详解  linux top下的 minerd 木马清除方法  如何在 Pandas 中基于一列条件计算另一列的分组均值  Python文件操作最佳实践_稳定性说明【指导】  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  如何解决hover在ie6中的兼容性问题  Python企业级消息系统教程_KafkaRabbitMQ高并发应用