ThinkPHP 模块化和URL模式

本节课,我们主要探讨两个问题。一个是 ThinkPHP3.2.1 的模块化设计,可以支持多
模块的应用创建;第二个就是 URL 模式,提供了多种 URL 显示方式。
一.模块化设计
在上一节,我们直接复制 index.php创建了 admin.php 文件。这样会自动生成两个目录,
分别为 Weibo和 Admin,前者代表前台,后者代表后台。那么现在采用 ThinkPHP 模块化架
构思想,可以把 Weibo内的 Home 目录当作前台、Weibo/Admin 目录当作后台。
操作方法: 把 Home 目录复制一份到同级目录, 改名为 Admin。 把 Admin 中的 Controller
内的 IndexController.class.php的命名空间改为如下:
//修改Admin模块的命名空间
namespace Admin\Controller;
最终访问的地址就是:http://localhost/demo39/index.php/Admin
有一些模块我们希望是被用户禁止访问的,比如 Common 和 Runtime 模块。当然,框
架已经在默认就禁止访问了。
当强行访问 Common 模块的时候,会提示: “无法加载模块:Common”的错误信息。
//禁止访问模块
‘MODULE_DENY_LIST’ => array(‘Common’,’Runtime’),
PS:当你去掉数组里的’Common’,那么会提示: “无法加载控制器:Index”的错误信
息。说明这个模块已经可以访问了。
//禁止访问模块,添加一个Admin模块
‘MODULE_DENY_LIST’ => array(‘Common’,’Runtime’,’Admin’),
有禁止访问模块的设置,就有允许访问模块的设置。当设置了此选项,就务必把所有允
许访问的模块都添加上,否则会变成拒绝访问。
//允许访问的模块,设置了,就必须写全,漏写的将无法访问
‘MODULE_ALLOW_LIST’ => array(‘Home’,’Admin’),
如果有多个访问模块, 那么在默认URL访问的时候, 应该有一个首选访问。 默认是 Home,
想设置 Admin 为默认,可以这么设置:
//设置默认起始模块
‘DEFAULT_MODULE’ => ‘Admin’,应用项目如果只允许单个模块的话,可以设置拒绝多个模块,这样创建更多的模块将失
效。
//单模块设置
‘MULTI_MODULE’ => false,
有时,你会觉得 index.php/Admin 这样很麻烦。你可能想直接 admin.php 就代表后
台就方便很多,那么可以使用多入口设置。
这里的多入口和上一节多个应用项目不同,而是通过 admin.php 访问 Weibo 目录下的
Admin 模块。将 index.php 复制出来改成 admin.php,然后添加如下代码:
//默认指向Admin模块
$_GET[‘m’] = ‘Admin’;
//默认指向Index控制器
$_GET[‘c’] = ‘Index’;
二.URL 模式
ThinkPHP的URL模式有四种,默认是PATHINFO模式,其他三种分别为:普通模式、
REWRITE和兼容模式。
http://localhost/demo39/index.php/模块/控制器/操作
//用户密码传参
class UserController extends Controller {
public function test($user, $pass) {
echo ‘user:’.$user.'<br />pass:’.$pass;
}
}
//PATHINFO模式
http://localhost/demo39/index.php/Home/User/test/user/Lee/pass/123
在这条 URL 上,Home 表示模块,User 表示控制器,test 表示方法,user/Lee 表示
第一个键值对,pass/123 表示第二个键值对。
PATHINFO 模式下默认的分隔符是/,我们可以设置为你想要的,比如:_
//设置键值对分隔符
‘URL_PATHINFO_DEPR’=>’_’,
设置了分隔符的 URL:
http://localhost/demo39/index.php/Home_User_test_user_Lee_pass_123
//普通模式
http://localhost/demo39/index.php?m=Home&c=User&a=test&user=Lee&pass
=123
在这条 URL 上,我们发现采用的就是传统的 GET 模式,m 表示模块,c 表示控制器,a
表示方法,后面的表示键值对。
普通模式的 m、c、a 可以自行设置为你习惯的键名称://修改键名称
‘VAR_MODULE’ => ‘mm’,
‘VAR_CONTROLLER’ => ‘cc’,
‘VAR_ACTION’ => ‘aa’,
http://localhost/demo39/index.php?mm=Home&cc=User&aa=test&user=Lee&p
ass=123
//REWRITE模式(重写模式)
httpd.conf 配置文件中加载了 mod_rewrite.so 模块
AllowOverride None 将 None 改为 All
把下面的内容保存为.htaccess 文件放到应用入口文件的同级目录下
这样,ThinkPHP 自带的.htaccess 文件就起作用了,可以过滤掉 index.php 这个字
符串。
<IfModule mod_rewrite.c>
Options +FollowSymlinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
//去除了index.php
http://localhost/demo39/Home/User/test/user/Lee/pass/123
PS:兼容模式一般用于不支持 PATHINFO 的特殊环境,基本上用不到。