# 模式扩展
[上一页](# "上一页")[下一页](# "下一页")
模式扩展属于系统核心级别的扩展,可以改变底层的架构体系。在众多扩展中,也只有模式扩展具有改变和替换核心MVC的可能,其他扩展只是在标准模式基础之上的增强和替换,无法从根本上改变底层的架构。所以,大家会看到不同的模式扩展可能具有很大的用法区别,有些模式扩展是为某个特别的应用环境而定制的,例如CLI模式、AMF模式和PHPRPC模式。
新版对模式扩展的改进和行为扩展的增强使得开发人员对底层框架的DIY更加方便,也正是因为支持对框架底层进行DIY,使得ThinkPHP能够满足企业开发中更加复杂的项目需求。
### 使用模式扩展
我们前面所涉及的所有用法都是基于框架内置的标准模式的,除了标准模式之外,官方还提供了一些常用的模式扩展,模式扩展的目录位于Extend/Mode下面,已经提供的包括:Cli(命令模式)、Lite(精简模式)、Thin(简洁模式)、AMF模式、PHPRPC模式和REST模式,他们为不同的需求提供了不同的底层框架解决方案。通常来说不同的模式之间是无法进行切换。
要使用某个扩展模式,需要修改项目的入口文件,添加一行定义代码:`define('MODE_NAME','模式扩展名称');`每个项目只能使用一个模式扩展,所以即使采用了分组,不同的分组也只能采用相同的模式扩展。使用了模式扩展后,项目的编译缓存文件有所变化,例如,如果你当前用的是REST模式,那么生成的编译缓存文件则会变成~rest_runtime.php。
具体不同模式的用法需要参考每个模式扩展的帮助文件。
### 简洁模式
简洁模式相当于标准模式的主要区别在于:
默认不使用任何模板引擎(可以自己在操作方法里面调用);
模型仅支持原生SQL操作和事务;
支持多数据库切换和连接;
默认仅支持MySQL数据库;
不支持语言包、模块分组、模板主题和Dispatch功能;
去除了大部分扩展机制;
如果你的应用选择了Mysql数据库,并且完全使用原生SQL操作,并希望有一个轻巧的核心,那么简洁模式是一个很好的选择。
要使用简洁模式,需要在项目的入口文件中添加模式定义:`define('MODE_NAME','Thin');//采用简洁模式运行`
### 精简模式
精简模式在简洁模式的基础上,增加了:
默认使用PHP模板;
支持不带路由的Dispatch;
支持不带回调接口的CURD操作;
支持连贯操作、统计查询;
精简模式比简洁模式在模型方面多了CURD和连贯操作,如果你习惯于使用PHP作为模板,并且还是喜欢使用模型的CURD功能,但又不希望核心那么庞大,那么精简模式是一个不错的选择。
要使用精简模式,需要在项目的入口文件中添加模式定义:`define('MODE_NAME','Lite');//采用精简模式运行`
### 命令模式
命令模式用于支持命令行模式下面的PHP应用,需要在入口文件设置:`define('MODE_NAME', 'cli') //采用CLI运行模式运行`在命令模式下面,支持两种命令行的参数模式,
一、PATHINFO参数模式(URL_MODEL为1)
在PATHINFO参数模式下面,我们可以这样调用模块和操作`index.php module/action/id/4`二、普通参数模式(URL_MODEL设置为其它)
在普通参数模式下面 ,我们需要这样调用模块和操作`index.php module action id 4`在命令行模式下面,系统会自动把参数转换为GET变量,无论采用哪种命令行参数模式,我们可以直接使用GET变量获取参数,例如,采用下面的方式调用`index.php Info/read/category/2/id/4`在控制器中,我们可以直接获取$_GET['category'](这里传入的是2)和$_GET['id'](这里传入的是4)参数,如果你需要自己解析传入的参数顺序和值,就需要采用原生的系统变量$_SERVER['argv']来获取参数了。
### AMF模式
AMF模式采用了ZendAMF类库,支持AMF开发和Flash进行通讯。首先,我们需要设置当前运行模式为Amf模式,在入口文件中增加下面代码:`define('MODE_NAME', 'amf') //采用Amf运行模式运行`然后在项目配置文件中定义`'APP_AMF_ACTIONS'=>'Index,User,Shop…'// 定义AMF模式的模块列表`只有在APP_AMF_ACTIONS中定义的模块才能在Amf模式中调用到。
最后一步就是在你的Flash客户端或者AS脚本中修改Amf的网关地址为当前项目的入口地址即可。
### PHPRPC模式
首先,我们设置当前运行模式为Phprpc模式:`define('MODE_NAME', 'phprpc') //采用Phprpc运行模式运行`然后在项目配置文件中定义`'APP_PHPRPC_ACTIONS'=>'Index,User,Shop…'// 定义PHPRPC模式的模块列表`只有在APP_PHPRPC_ACTIONS中定义的模块才能在PHPRPC模式中调用到。
### REST模式
Rest模式主要是为了支持RESTFul的开发,鉴于目前Rest主要用来提供接口服务,所以单独作为模式扩展来使用。首先,我们设置当前运行模式为rest模式:`define('MODE_NAME', 'rest') //采用rest模式运行`关于Rest的更多用法,请参考16.2 REST支持部分。
### 定制模式扩展
要定制自己的模式扩展,首先要定义模式扩展的定义文件,定义文件位于Extend/Mode目录下面,命名就是模式扩展的名称(全部为小写),定义文件是一个数组,包括:
| core | 系统核心列表文件定义 |
|-----|-----|
| config | 模式配置文件 |
| alias | 模式别名定义文件 |
| extends | 模式系统行为定义 |
| tags | 应用行为定义文件 |
core是模式核心列表文件,如果core没有定义,则表示采用标准模式的核心列表文件,被定义的文件列表会纳入编译缓存,核心列表可以包含函数文件和类库文件,注意下面的文件无需定义:系统的Common公共文件、Think类、ThinkException类和Behavior类。下面的类必须定义:App类和Action类。
config是模式配置定义,可以采用文件名或者直接用数组定义的方式。
alias是模式别名定义,可以采用文件名或者直接用数组定义的方式。
extends是模式系统行为定义,可以采用文件名或者直接用数组定义的方式。
tags是应用行为定义,可以采用文件名或者直接用数组定义的方式。
上面这些定义,只有需要的时候才要定义,如果没有则可不必定义,一般core定义是模式扩展必须的,改变核心列表文件的定义就能起到自定义MVC的目的。
例如,命令行模式的模式定义文件为:`// 命令行模式定义文件
return array(
'core' => array(
MODE_PATH.'Cli/functions.php', // 命令行系统函数库
MODE_PATH.'Cli/Log.class.php',
MODE_PATH.'Cli/App.class.php',
MODE_PATH.'Cli/Action.class.php',
),
// 项目别名定义文件 [支持数组直接定义或者文件名定义]
'alias' => array(
'Model' => MODE_PATH.'Cli/Model.class.php',
'Db' => MODE_PATH.'Cli/Db.class.php',
'Cache' => CORE_PATH.'Core/Cache.class.php',
'Debug' => CORE_PATH.'Util/Debug.class.php',
),
// 系统行为定义文件
'extends' => array(),
);`模式扩展本身是一个扩展的集成,自身还可以包含其他扩展,例如行为扩展、函数扩展、类库扩展等。如果模式扩展中包含了自己的行为扩展,那么可以放到模式扩展目录下面的Behavior目录下面,系统可以自动加载该目录下面的行为类库。
[上一页](# "上一页")[下一页](# "下一页")
- 序言
- 1. 入门
- 1.1 简介
- 1.2 基础概念
- 1.3 获取ThinkPHP
- 1.4 环境要求
- 1.5 许可协议
- 1.6 目录结构
- 1.7 命名规范
- 1.8 MVC分层
- 1.9 CBD架构
- 1.10 特性概述
- 1.11 系统流程
- 1.12 开发流程
- 2. 入口
- 2.1 入口文件
- 2.2 项目目录
- 2.3 部署目录
- 2.4 项目编译
- 2.5 调试模式
- 3. 配置
- 3.1 配置格式
- 3.2 惯例配置
- 3.3 项目配置
- 3.4 调试配置
- 3.5 分组配置
- 3.6 读取配置
- 3.7 动态配置
- 3.8 扩展配置
- 4. 函数和类库
- 4.1 函数库
- 4.2 类库
- 5. 控制器
- 5.1 URL模式
- 5.2 模块和操作
- 5.3 定义控制器
- 5.4 空操作
- 5.5 空模块
- 5.6 模块分组
- 5.7 URL伪静态
- 5.8 URL路由
- 5.9 URL重写
- 5.10 URL生成
- 5.11 URL大小写
- 5.12 前置和后置操作
- 5.13 跨模块调用
- 5.14 页面跳转
- 5.15 重定向
- 5.16 获取系统变量
- 5.17 判断请求类型
- 5.18 获取URL参数
- 5.19 AJAX返回
- 5.20 Action参数绑定
- 5.21 多层控制器支持
- 6. 模型
- 6.1 模型定义
- 6.2 模型实例化
- 6.3 字段定义
- 6.4 数据主键
- 6.5 属性访问
- 6.6 跨库操作
- 6.7 连接数据库
- 6.8 切换数据库
- 6.9 分布式数据库
- 6.10 创建数据
- 6.11 字段映射
- 6.12 连贯操作
- 6.13 CURD操作
- 6.14 ActiveRecord
- 6.15 自动验证
- 6.16 命名范围
- 6.17 自动完成
- 6.18 查询语言
- 6.19 查询锁定
- 6.20 字段排除
- 6.21 事务支持
- 6.22 高级模型
- 6.23 视图模型
- 6.24 关联模型
- 6.25 Mongo模型
- 6.26 动态模型
- 6.27 虚拟模型
- 6.28 多层模型支持
- 7. 视图
- 7.1 模板定义
- 7.2 模板赋值
- 7.3 模板输出
- 7.4 模板替换
- 7.5 获取内容
- 7.6 模板引擎
- 7.7 布局模板
- 8. 模板引擎
- 8.1 变量输出
- 8.2 系统变量
- 8.3 使用函数
- 8.4 默认值输出
- 8.5 使用运算符
- 8.6 内置标签
- 8.7 包含文件
- 8.8 导入文件
- 8.9 Volist标签
- 8.10 Foreach标签
- 8.11 For标签
- 8.12 Switch标签
- 8.13 比较标签
- 8.14 三元运算
- 8.15 范围判断标签
- 8.16 Present标签
- 8.17 Empty标签
- 8.18 Defined标签
- 8.19 Define标签
- 8.20 Assign标签
- 8.21 IF标签
- 8.22 标签嵌套
- 8.23 使用PHP代码
- 8.24 模板布局
- 8.25 模板继承
- 8.26 原样输出
- 8.27 模板注释
- 8.28 引入标签库
- 8.29 修改定界符
- 8.30 避免JS混淆
- 9. 日志
- 9.1 日志级别
- 9.2 记录方式
- 9.3 手动记录
- 10. 错误
- 10.1 异常处理
- 10.2 异常模板
- 10.3 异常显示
- 11. 调试
- 11.1 运行状态
- 11.2 页面Trace
- 11.3 调试方法
- 12. 缓存
- 12.1 缓存方式
- 12.2 动态缓存
- 12.3 缓存队列
- 12.4 快捷缓存
- 12.5 快速缓存
- 12.6 查询缓存
- 12.7 SQL解析缓存
- 12.8 静态缓存
- 13. 扩展
- 13.1 行为扩展
- 13.2 类库扩展
- 13.3 控制器扩展
- 13.4 模型扩展
- 13.5 驱动扩展
- 13.6 Widget扩展
- 13.7 模式扩展
- 13.8 引擎扩展
- 14. 安全
- 14.1 表单令牌
- 14.2 字段类型验证
- 14.3 防止SQL注入
- 14.4 输入过滤
- 14.5 上传安全
- 14.6 防止XSS攻击
- 14.7 其他安全建议
- 14.8 目录安全文件
- 14.9 保护模板文件
- 15. 性能
- 15.1 关闭调试模式
- 15.2 开启缓存
- 15.3 合并字段缓存
- 15.4 优化SQL
- 15.5 替换入口
- 15.6 前端优化
- 16. 部署
- 16.1 PATH_INFO支持
- 16.2 隐藏index.php
- 16.3 二级域名部署
- 16.4 定制错误页面
- 16.5 设置时区
- 17. SAE支持
- 17.1 SAE介绍
- 17.2 获取SAE
- 17.3 SAE开发
- 18. REST支持
- 18.1 REST介绍
- 18.2 REST模式
- 18.3 REST配置
- 18.4 REST路由
- 18.5 REST方法
- 19. 杂项
- 19.1 Session支持
- 19.2 Cookie支持
- 19.3 日期和时间
- 19.4 WML开发
- 19.5 多语言
- 19.6 数据分页
- 19.7 文件上传
- 19.8 验证码
- 19.9 图片添加水印
- 19.10 IP获取和定位
- 20. 附录
- 20.1 常量参考
- 20.2 配置参考
- 20.3 关于升级
- 20.4 大事记
- 鸣谢
- 关于