一个典型的URL访问规则是(我们以默认的PATHINFO模式为例说明,当然也可以支持普通的URL模式):
-
http://serverName/index.php(或者其他应用入口文件)/模块/控制器/操作/[参数名/参数值...]
ThinkPHP3.2的应用可以支持切换到命令行访问,如果切换到命令行模式下面的访问规则是:
-
>php.exe index.php(或其它应用入口文件) 模块/控制器/操作/[参数名/参数值...]
解释下其中的几个概念:
名称 | 描述 |
---|---|
应用 | 基于同一个入口文件访问的项目我们称之为一个应用。 |
模块 | 一个应用下面可以包含多个模块,每个模块在应用目录下面都是一个独立的子目录。 |
控制器 | 每个模块可以包含多个控制器,一个控制器通常体现为一个控制器类。 |
操作 | 每个控制器类可以包含多个操作方法,也可能是绑定的某个操作类,每个操作是URL访问的最小单元。 |
公共模块的位置可以通过COMMON_PATH常量改变,我们可以在入口文件中重新定义COMMON_PATH如下:
-
define('COMMON_PATH','./Common/');
如果我们需要生成一个Admin模块用于后台应用,在应用入口文件中定义如下:
-
// 绑定Admin模块到当前入口文件
-
define('BIND_MODULE','Admin');
然后访问URL地址
-
http://serverName/index.php
就会生成Admin模块的目录,并生成一个默认的控制器类Admin\Controller\IndexController
。 如果需要生成更多的控制器类,可以定义BUILD_CONTROLLER_LIST
常量,例如:
-
// 绑定Admin模块到当前入口文件
-
define('BIND_MODULE','Admin');
-
define('BUILD_CONTROLLER_LIST','Index,User,Menu');
访问后会自动生成三个指定的控制器类:
-
Admin\Controller\IndexController
-
Admin\Controller\UserController
-
Admin\Controller\MenuController
Think\Controller
,如果需要继承其他的公共类需要另外调整。 如果在应用的公共配置文件中设置关闭了
APP_USE_NAMESPACE
的话,生成的控制器类则不会采用命名空间定义。
还可以自己手动调用Think\Build
类的方法来生成控制器类,例如:
-
// 生成Admin模块的Role控制器类
-
// 默认类库为Admin\Controller\RoleController
-
// 如果已经存在则不会重新生成
-
\Think\Build::buildController('Admin','Role');
同样,也可以定义BUILD_MODEL_LIST
支持生成多个模型类:
-
// 绑定Admin模块到当前入口文件
-
define('BIND_MODULE','Admin');
-
define('BUILD_CONTROLLER_LIST','Index,User,Menu');
-
define('BUILD_MODEL_LIST','User,Menu');
-
define('APP_PATH','./Application/');
-
require './ThinkPHP/ThinkPHP.php';
访问会自动生成模型类:
-
Admin\Model\UserModel
-
Admin\Model\MenuModel
注意:默认生成的模型类都是继承
Think\Model
,如果需要继承公共的模型类需要另外调整。 如果在应用的公共配置文件中设置关闭了APP_USE_NAMESPACE
的话,生成的模型类则不会采用命名空间定义。
也可以自己手动调用Think\Build类的方法来生成模型类,例如:
-
// 生成Admin模块的Role模型类
-
// 默认类库为Admin\Model\RoleModel
-
// 如果已经存在则不会重新生成
-
\Think\Build::buildModel('Admin','Role');
Common
模块和
Runtime
模块(Runtime目录是默认的运行时目录),我们可以增加其他的禁止访问模块列表
-
// 设置禁止访问的模块列表
-
'MODULE_DENY_LIST' => array('Common','Runtime','Api'),
如果你的应用下面模块比较少,还可以设置允许访问列表和默认模块,这样可以简化默认模块的URL访问。
-
'MODULE_ALLOW_LIST' => array('Home','Admin','User'),
-
'DEFAULT_MODULE' => 'Home',
如果你的应用够简单,那么也许仅仅用一个模块就可以完成,那么可以直接设置:
-
// 关闭多模块访问
-
'MULTI_MODULE' => false,
-
'DEFAULT_MODULE' => 'Home',
一旦关闭多模块访问后,就只能访问默认模块(这里设置的是Home)。
3.2.0版本写法:
-
// 绑定Home模块到当前入口文件
-
$_GET['m'] = 'Home';
3.2.1以上版本写法:
-
// 绑定Home模块到当前入口文件
-
define('BIND_MODULE','Home');
绑定模块后,原来的访问地址
-
http://serverName/index.php/Home/Index/index
就变成
-
http://serverName/home.php/Index/index
-
$_GET['m'] = 'Home'; // 绑定Home模块到当前入口文件
-
$_GET['c'] = 'Index'; // 绑定Index控制器到当前入口文件
3.2.1以上版本写法:
-
define('BIND_MODULE', 'Home'); // 绑定Home模块到当前入口文件
-
define('BIND_CONTROLLER','Index'); // 绑定Index控制器到当前入口文件
绑定模块和控制器后,原来的访问地址:
-
http://serverName/index.php/Home/Index/index
就变成:
-
http://serverName/home.php/index
入口文件是应用的单一入口,对应用的所有请求都定向到应用入口文件,系统会从URL参数中解析当前请求的模块、控制器和操作:
-
http://serverName/index.php/模块/控制器/操作
这是3.2版本的标准URL格式。
可以通过设置模块绑定或者域名部署等方式简化URL地址中的模块及控制器名称。
URL大小写
ThinkPHP框架的URL是区分大小写(主要是针对模块、控制器和操作名,不包括应用参数)的,这一点非常关键,因为ThinkPHP的命名规范是采用驼峰法(首字母大写)的规则,而URL中的模块和控制器都是对应的文件,因此在Linux环境下面必然存在区分大小写的问题。
框架内置了一个配置参数用于解决URL大小写的问题,如下:
-
'URL_CASE_INSENSITIVE' => true,
当URL_CASE_INSENSITIVE
设置为true的时候表示URL地址不区分大小写,这个也是框架在部署模式下面的默认设置。
URL模式
如果我们直接访问入口文件的话,由于URL中没有模块、控制器和操作,因此系统会访问默认模块(Home)下面的默认控制器(Index)的默认操作(index),因此下面的访问是等效的:
-
http://serverName/index.php
-
http://serverName/index.php/Home/Index/index
这种URL模式就是系统默认的PATHINFO模式,不同的URL模式获取模块和操作的方法不同,ThinkPHP支持的URL模式有四种:普通模式、PATHINFO、REWRITE和兼容模式,可以设置URL_MODEL参数改变URL模式。
URL模式 | URL_MODEL设置 |
---|---|
普通模式 | 0 |
PATHINFO模式 | 1 |
REWRITE模式 | 2 |
兼容模式 | 3 |
普通模式
普通模式也就是传统的GET传参方式来指定当前访问的模块和操作,例如:http://localhost/?m=home&c=user&a=login&var=value
m参数表示模块,c参数表示控制器,a参数表示操作(当然这些参数都是可以配置的),后面的表示其他GET参数。
如果默认的变量设置和你的应用变量有冲突的话,你需要重新设置系统配置,例如改成下面的:
-
'VAR_MODULE' => 'module', // 默认模块获取变量
-
'VAR_CONTROLLER' &#