ThinkPHP 3.2.3 多模块 和 多应用 的配置
多模块
在 ThinkPHP 3.2.3 中,默认的应用目录是 ./Application,下面的默认模块是 Home 模块,如果此时需要添加一个 Admin 模块用于后台应用,根据手册 http://www.kancloud.cn/manual/thinkphp/1696 中 “自动生成模块目录” 的部分的说明,在默认的入口文件 ./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 官方推荐的分组模式。
另外一种配置就是多入口设计(参见手册 http://www.kancloud.cn/manual/thinkphp/1696),即在默认入口文件 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 控制器。
ThinkPHP 3.2.3 多模块 和 多应用 的配置的更多相关文章
- thinkphp访问不存在的模块或者方法跳转到404页面
使用的thinkphp 版本是3.2.0, 在config.php中配置 404地址,即可: 'TMPL_EXCEPTION_FILE' => './Application/Home/View/ ...
- 【ThinkPHP】解析ThinkPHP5创建模块
在根目录下有一个build.php文件,该文件是自动生成的,自动创建模块.build.php的文件内容如下: <?php return [ // 生成应用公共文件 '__file__' => ...
- 使用THINKPHP中的控制器和模块查询数据库
1,自定义一个UserController的控制器,导入tp的控制器与模块执行相应的操作. ----var_dump()方法是判断一个变量的类型与长度,并输出变量的数值,如果变量有值输的是变量的值. ...
- ThinkPHP访问不存在的模块跳到404页面
在ACTION中新建一个文件EmptyAction.class.php,文件中的代码如下: <?php class EmptyAction extends Action{ functio ...
- 关于ThinkPHP中Session不能夸模块/控制器使用的问题-网上的答案我做个补充
1,确保c:/windows目录下有php.ini文件2,修改php.ini中的session.auto_start = 0 为 session.auto_start = 1 //设置自动开启ses ...
- thinkphp设置默认访问的模块
在index.php中加入(可以省略Home,直接写控制器和方法访问) define('BIND_MODULE','Home'); 在config.php里边加入 'MODULE_ALLOW_LIST ...
- ThinkPHP第十七天(隐藏index.php和简短路径配置)
1.路由设置,让路径中不显示index.php方法: 第一步:在apache中的httpd.conf中查找: LoadModule rewrite_module modules/mod_rewrite ...
- Python(文件、文件夹压缩处理模块,shelve持久化模块,xml处理模块、ConfigParser文档配置模块、hashlib加密模块,subprocess系统交互模块 log模块)
OS模块 提供对操作系统进行调用的接口 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目 ...
- ThinkPHP第七天(F函数使用,项目分组配置,项目分组模板文件放置规则配置)
1.F(文件名称,写入数据,写入地址),用于将数据写入至磁盘文件中,如F('Data',$arr,'./Data/'),作用是将$arr写入至网站根目录的Data文件夹中的Data.php中. 2.读 ...
随机推荐
- 滑雪(简单dp)
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 81099 Accepted: 30239 Description Mic ...
- WPF中文字体问题
- 点击 Run 之后发生了什么?
这是我以前去链家网面试的一个题目,当时回答不够全面,现在看了2016 WWDC以及Sunnyxx iDev大会的分享之后,感觉对这个问题有了一些简单的认识,就来总结下.如果大家有补充,麻烦评论下哦! ...
- hadoop 分布式缓存
Hadoop 分布式缓存实现目的是在所有的MapReduce调用一个统一的配置文件,首先将缓存文件放置在HDFS中,然后程序在执行的过程中会可以通过设定将文件下载到本地具体设定如下: public s ...
- NUC_HomeWork1 -- POJ1088(DP)
D - 滑雪 Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Mic ...
- Mariadb 数据库写入中文乱码问题
从其他表里面导入数据,出现中文乱码错误.之前操作时并没有碰到类似问题,有些不得其解. 在网上搜了下,最后参考这篇文章,在执行insert前,先执行 set names gbk; 然后成功插入. 链接: ...
- POJ 1845 (约数和+二分等比数列求和)
题目链接: http://poj.org/problem?id=1845 题目大意:A^B的所有约数和,mod 9901. 解题思路: ①整数唯一分解定理: 一个整数A一定能被分成:A=(P1^K1) ...
- Leetcode Word Break
Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separa ...
- topcoder SRM 623 DIV2 CatchTheBeatEasy
比较简单的一题,纠结比较久的是把my_cmp和my_minus放在类中,利用sort函数会出现 no matching function for call to ""sort(st ...
- 洛谷 P1031 均分纸牌 Label:续命模拟QAQ
题目描述 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若于张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 ...