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