目录 搜索
序言基础获取ThinkPHP环境要求目录结构入口文件自动生成模块控制器开发规范配置配置格式配置加载读取配置动态配置扩展配置批量配置架构模块化设计URL模式多层MVCCBD模式命名空间自动加载应用模式项目编译系统流程路由路由定义规则路由正则路由静态路由闭包支持实例说明控制器控制器定义前置和后置操作Action参数绑定伪静态URL大小写URL生成AJAX返回跳转和重定向输入变量请求类型空操作空控制器插件控制器操作绑定到类模型模型定义模型实例化字段定义连接数据库切换数据库分布式数据库支持连贯操作WHERETABLEALIASDATAFIELDORDERLIMITPAGEGROUPHAVINGJOINUNIONDISTINCTLOCKCACHECOMMENTRELATIONUSINGfetchSqlTOKENSTRICTINDEX命名范围CURD操作数据创建数据写入数据读取数据更新数据删除ActiveRecord字段映射查询语言查询方式表达式查询快捷查询区间查询组合查询统计查询SQL查询动态查询子查询自动验证自动完成参数绑定虚拟模型模型分层视图模型关联模型高级模型Mongo模型视图模板定义模板主题模板赋值模板渲染获取模板地址获取内容模板引擎模板变量输出系统变量使用函数默认值输出使用运算符标签库模板继承修改定界符三元运算包含文件内置标签Volist标签Foreach标签For标签Switch标签比较标签范围判断标签IF标签Present标签Empty标签Defined标签Assign标签Define标签标签嵌套import标签使用PHP代码原样输出模板注释模板布局模板替换调试调试模式异常处理日志记录页面TraceTrace方法变量调试性能调试错误调试模型调试缓存数据缓存快速缓存查询缓存静态缓存安全输入过滤表单合法性检测表单令牌防止SQL注入目录安全文件保护模板文件上传安全防止XSS攻击其他安全建议扩展类库扩展驱动扩展缓存驱动数据库驱动日志驱动Session驱动存储驱动模板引擎驱动标签库驱动行为扩展标签扩展Widget扩展应用模式部署PATH_INFO支持URL重写模块部署域名部署入口绑定替换入口专题SESSION支持Cookie支持多语言支持数据分页文件上传验证码图像处理RESTFulRPCSAEIP获取和定位附录常量参考配置参考升级指导鸣谢
文字

一个完整的ThinkPHP应用基于模块/控制器/操作设计,并且,如果有需要的话,可以支持多入口文件和多级控制器。

ThinkPHP新版采用模块化的架构设计思想,对目录结构规范做了调整,可以支持多模块应用的创建,让应用的扩展更加方便。

一个典型的URL访问规则是(我们以默认的PATHINFO模式为例说明,当然也可以支持普通的URL模式):

http://serverName/index.php(或者其他应用入口文件)/模块/控制器/操作/[参数名/参数值...]

ThinkPHP的应用可以支持切换到命令行访问,如果切换到命令行模式下面的访问规则是:

>php.exe index.php(或其它应用入口文件) 模块/控制器/操作/[参数名/参数值...]

解释下其中的几个概念:

名称 描述
应用 基于同一个入口文件访问的项目我们称之为一个应用。
模块 一个应用下面可以包含多个模块,每个模块在应用目录下面都是一个独立的子目录。
控制器 每个模块可以包含多个控制器,一个控制器通常体现为一个控制器类。
操作 每个控制器类可以包含多个操作方法,也可能是绑定的某个操作类,每个操作是URL访问的最小单元。

模块化设计的思想下面模块是最重要的部分,模块其实是一个包含配置文件、函数文件和MVC文件(目录)的集合。

模块设计

新版采用模块化的设计架构,下面是一个应用目录下面的模块目录结构,每个模块可以方便的卸载和部署,并且支持公共模块。

Application      默认应用目录(可以设置)
├─Common         公共模块(不能直接访问)
├─Home           前台模块
├─Admin          后台模块
├─...            其他更多模块
├─Runtime        默认运行时目录(可以设置)

默认情况下,只要应用目录下面存在模块目录,该模块就可以访问,只有当你希望禁止某些模块或者仅允许模块访问的时候才需要进行模块列表的相关设置。

每个模块是相对独立的,其目录结构如下:

├─Module         模块目录
│  ├─Conf        配置文件目录
│  ├─Common      公共函数目录
│  ├─Controller  控制器目录
│  ├─Model       模型目录
│  ├─Logic       逻辑目录(可选)
│  ├─Service     Service目录(可选)
│  ... 更多分层目录可选
│  └─View        视图目录

由于采用多层的MVC机制,除了Conf和Common目录外,每个模块下面的目录结构可以根据需要灵活设置和添加,所以并不拘泥于上面展现的目录

公共模块

Common模块是一个特殊的模块,是应用的公共模块,访问所有的模块之前都会首先加载公共模块下面的配置文件(Conf/config.php)和公共函数文件(Common/function.php)。但Common模块本身不能通过URL直接访问,公共模块的其他文件则可以被其他模块继承或者调用。

公共模块的位置可以通过COMMON_PATH常量改变,我们可以在入口文件中重新定义COMMON_PATH如下:

define('COMMON_PATH','./Common/');
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';

其应用目录结构变成:

www  WEB部署目录(或者子目录)
├─index.php       入口文件
├─README.md       README文件
├─Common          应用公共模块目录
├─Application     应用模块目录
├─Public          应用资源文件目录
└─ThinkPHP        框架目录

定义之后,Application目录下面就不再需要Common目录了。

自动生成模块目录

可以支持自动生成默认模块之外的模块目录以及批量生成控制器和模型类。

例如,如果我们需要生成一个Admin模块用于后台应用,在应用入口文件中定义如下:

// 绑定Admin模块到当前入口文件
define('BIND_MODULE','Admin');
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';

然后访问URL地址

http://serverName/index.php

就会生成Admin模块的目录,并生成一个默认的控制器类Admin\Controller\IndexController。 如果需要生成更多的控制器类,可以定义BUILD_CONTROLLER_LIST常量,例如:

// 绑定Admin模块到当前入口文件
define('BIND_MODULE','Admin');
define('BUILD_CONTROLLER_LIST','Index,User,Menu');
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';

访问后会自动生成三个指定的控制器类:

Admin\Controller\IndexController
Admin\Controller\UserController
Admin\Controller\MenuController

注意:默认生成的控制器类都是继承Think\Controller,如果需要继承其他的公共类需要另外调整。 如果在应用的公共配置文件中设置关闭了 APP_USE_NAMESPACE的话,生成的控制器类则不会采用命名空间定义。

同样,也可以定义BUILD_MODEL_LIST支持生成多个模型类:

// 绑定Admin模块到当前入口文件
define('BIND_MODULE','Admin');
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\Controller\RoleController
// 如果已经存在则不会重新生成
\Think\Build::buildController('Admin','Role');
// 生成Admin模块的Role模型类
// 默认类库为Admin\Model\RoleModel
// 如果已经存在则不会重新生成
\Think\Build::buildModel('Admin','Role');

更多的方法可以参考Think\Build类库。

禁止访问模块

ThinkPHP对模块的访问是自动判断的,所以通常情况下无需配置模块列表即可访问,但可以配置禁止访问的模块列表(用于被其他模块调用或者不开放访问),默认配置中是禁止访问Common模块和Runtime模块(Runtime目录是默认的运行时目录),我们可以增加其他的禁止访问模块列表:

// 设置禁止访问的模块列表
'MODULE_DENY_LIST'      =>  array('Common','Runtime','Api'),

设置后,Api模块不能通过URL直接访问,事实上,可能我们只是在该模块下面放置一些公共的接口文件,因此都是内部调用即可。

设置访问列表

如果你的应用下面模块比较少,还可以设置允许访问列表和默认模块,这样可以简化默认模块的URL访问。

'MODULE_ALLOW_LIST'    =>    array('Home','Admin','User'),
'DEFAULT_MODULE'       =>    'Home',

设置之后,除了Home、Admin和User模块之外的模块都不能被直接访问,并且Home模块是默认访问模块(可以不出现在URL地址)。

单模块设计

如果你的应用够简单,那么也许仅仅用一个模块就可以完成,那么可以直接设置:

// 关闭多模块访问
'MULTI_MODULE'          =>  false,
'DEFAULT_MODULE'        =>  'Home',

一旦关闭多模块访问后,就只能访问默认模块(这里设置的是Home)。

单模块设计后公共模块依然有效

多入口设计

可以给相同的应用及模块设置多个入口,不同的入口文件可以设置不同的应用模式或者绑定模块。

例如,我们在index.php文件的同级目录新增一个admin.php入口文件,并绑定Admin模块:

// 绑定Home模块到当前入口文件
define('BIND_MODULE','Admin');
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';

如果你更改了系统默认的变量设置,则需要做对应的模块绑定的变量调整。

绑定模块后,原来的访问地址

http://serverName/index.php/Admin/Index/index

就变成

http://serverName/admin.php/Index/index

同样的方式,我们也可以在入口文件中绑定控制器,例如:

define('BIND_MODULE', 'Home'); // 绑定Home模块到当前入口文件
define('BIND_CONTROLLER','Index'); // 绑定Index控制器到当前入口文件
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';

绑定模块和控制器后,原来的访问地址:

http://serverName/index.php/Home/Index/index

就变成:

http://serverName/home.php/index

不同的入口文件还可以用于绑定不同的应用模式,参考应用模式部分。

上一篇: 下一篇:
  页面正在加载中