多模块

在 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 控制器。

最新文章

  1. 1、Spring In Action 4th笔记(1)
  2. (转)小心FPGA的JTAG口(上电和下电顺序)
  3. Weblogic的JDBC详解
  4. git branch使用
  5. UIWebView 操作
  6. linux字符驱动程序结构
  7. 数据结构与算法课程作业--1014. Translation
  8. 【HTTP】Fiddler(一) - Fiddler简介和使用
  9. JavaScript高级程序设计15.pdf
  10. gitHub项目框架使用排名
  11. Delphi EurekaLog 调试内存泄露方法
  12. 11.java.lang.ArrayStoreException
  13. linux c编程 多线程(初级)《转载》---赠人玫瑰,手有余香!
  14. FastDFS php API
  15. java基础知识3--如何获取资源文件(Java中获取资源文件的url)
  16. find与tar的结合使用
  17. 漫漫人生路,学点Jakarta基础-重写(覆盖)、重载
  18. SpringCloud系列——SSO 单点登录
  19. 【原创】大数据基础之Oozie vs Azkaban
  20. 项目ITP(五) spring4.0 整合 Quartz 实现任务调度

热门文章

  1. hdu 4000Fruit Ninja 树状数组
  2. Hadoop 2.0安装以及不停集群加datanode
  3. 最近发现docker感觉不错
  4. gson 简要使用
  5. Facebook React.js库 入门实例教程
  6. STL 的运用 istringstream的运用
  7. Codeforces Round #244 (Div. 2) B. Prison Transfer
  8. ACM 16进制的简单运算
  9. jquery 操作iframe的几种方法总结
  10. 【BZOJ】3434: [Wc2014]时空穿梭