本章旨在帮助使用3.1版本的用户更方便的升级到3.2版本,给出了升级步骤和建议。
## 升级须知
如果从3.1版本升级到3.2版本,需要注意如下的升级须知并按照升级指导的操作步骤进行。
- 3.2版本要求PHP5.3.0以上,如果环境低于该版本,将无法升级;
- 本升级指导用于指导开发人员从3.1版本升级到3.2版本;
- 如果你的项目对框架核心进行过较大的改动的话不建议升级;
- 本指导手册不确保你的项目顺利升级,不对因升级带来的任何后果负责;
- 升级项目之前请做好各项备份工作。
## 准备工作
- 从官网或者github下载最新版本的ThinkPHP3.2;
- 把下载的ThinkPHP3.2解压缩,得到Application、Public和ThinkPHP目录,以及一个入口文件index.php;
- 备份你的项目文件(包括ThinkPHP核心目录)到安全的位置;
- 删除项目的Runtime目录;
- 把原来的ThinkPHP系统目录更名为ThinkPHP_old;
- 把原来的index.php入口文件更名为index_old.php;
- 如果原来的项目目录为Application更名为App;
- 把解压后的Application、ThinkPHP目录,以及index.php放入你的网站目录;
- 运行新的入口文件index.php,如果显示
![](http://box.kancloud.cn/2015-04-18_5531edd3067ae.png)
则准备工作已经完成,下面开始进行应用目录的调整工作。
## 应用目录调整
应用目录的调整分三种不同的情况:**未分组/普通分组/独立分组**,请根据自己的情况选择目录调整的方式。
### 未分组
如果你的项目未进行任何分组,请按照如下的方式调整目录结构:
删除Application/Common目录,在你的原有项目目录(假设为App)下面的Common、Conf和Lang目录移动到Application/Home目录下面,并把其中的Common/common.php文件改名为function.php,移动前后的位置类似于:
~~~
App/Common/common.php => Application/Home/Common/function.php
App/Common/extend.php => Application/Home/Common/extend.php(假设存在定义的话)
App/Conf/Config.php => Application/Home/Conf/config.php
App/Lang/zh-cn/common.php => Application/Home/Lang/zh-cn.php(假设存在的话)
~~~
把项目目录下面的Lib目录下面的所有子目录移动到Application/Home目录下面,类似于:
~~~
App/Lib/Action => Application/Home/Action
App/Lib/Model => Application/Home/Model
~~~
把项目目录下面的Tpl目录移动到Application/Home目录下面,并更名为View,类似于:
~~~
App/Tpl => Application/Home/View
~~~
调整后的目录结构类似于:
~~~
Application
├─Home
│ ├─Conf 配置文件目录
│ ├─Common 公共函数目录
│ ├─Action 控制器目录
│ ├─Model 模型目录
│ └─View 模版文件目录
~~~
### 普通分组
如果你的项目采用了普通分组,则按照下面的方式进行目录调整(以Home分组为例,其他分组参考调整):
项目公共函数目录下面的目录和文件作如下调整,类似于:
~~~
App/Common/common.php => Application/Common/Common/function.php
App/Common/Home/function.php => Application/Home/Common/function.php
~~~
项目目录下面的Conf目录如如下调整,类似于:
~~~
App/Conf/Config.php => Application/Common/Conf/config.php
App/Conf/Home/config.php => Application/Home/Conf/config.php
~~~
如果采用了语言包功能,目录如如下调整:
~~~
App/Lang/zh-cn/common.php => Application/Common/Lang/zh-cn.php
App/Lang/zh-cn/Home/lang.php => Application/Home/Lang/zh-cn.php
~~~
控制器目录调整如下,类似于:
~~~
App/Lib/Action/Home => Application/Home/Action
App/Lib/Action/Admin => Application/Admin/Action
~~~
模型目录调整如下,类似于:
~~~
App/Lib/Model => Application/Common/Model
App/Lib/Model/Home => Application/Home/Model(如果有定义)
~~~
模版目录调整如下,类似于:
~~~
App/Tpl/Home => Application/Home/View
~~~
调整后的目录结构如下:
~~~
Application
├─Common 应用公共模块
│ ├─Common 应用公共函数目录
│ └─Conf 应用公共配置文件目录
├─Home Home模块
│ ├─Action 模块控制器目录
│ ├─Common 模块函数公共目录
│ ├─Conf 模块配置文件目录
│ ├─Lang 模块语言包目录
│ ├─Model 模块模型目录
│ └─View 模块视图文件目录
~~~
> 其他分组参考Home分组进行调整即可。
### 独立分组
如果采用的是独立分组,公共函数目录作如下调整,类似于:
~~~
App/Common/common.php => Application/Common/Common/function.php
~~~
把项目目录下面的Conf、Lang移动到Application/Common目录下面,类似于:
~~~
App/Conf/Config.php => Application/Common/Conf/config.php
App/Lang/zh-cn/common.php => Application/Common/Lang/zh-cn.php
~~~
把独立分组目录(假设你的独立分组目录为App/Modules)下面的子目录都移动到原来的项目目录下面,类似于:
~~~
App/Modules/Home => Application/Home
~~~
并且把Home目录下面的Tpl目录更改为View。
调整后的目录结构如下:
~~~
Application
├─Common 应用公共模块
│ ├─Common 应用公共函数目录
│ └─Conf 应用公共配置文件目录
├─Home Home模块
│ ├─Action 模块控制器目录
│ ├─Common 模块函数公共目录
│ ├─Conf 模块配置文件目录
│ ├─Lang 模块语言包目录
│ ├─Model 模块模型目录
│ └─View 模块视图文件目录
~~~
> 其他分组参考Home分组进行调整即可。
## 配置调整
编辑 `Application/Common/config.php`(没有则创建一个新的文件),添加下面的配置参数:
~~~
'DEFAULT_C_LAYER' => 'Action', // 默认的控制器层名称
'MODULE_ALLOW_LIST' => array('Home','Admin',...), // 配置你原来的分组列表
'DEFAULT_MODULE' => 'Home', // 配置你原来的默认分组
~~~
未分组的情况下,再添加如下配置参数:
~~~
'MULTI_MODULE' => false, // 单模块访问
'DEFAULT_MODULE' => 'Home', // 默认访问模块
~~~
数据库连接配置参数DB_HOST如果原来配置的是localhost或者域名,请修改为ip地址,否则会导致数据库连接缓慢(这是PHP5.3的机制问题 非TP问题),例如之前如果是配置的:
~~~
'DB_HOST'=>'localhost'
~~~
建议改为:
~~~
'DB_HOST'=>'127.0.0.1'
~~~
原来的配置参数中废弃的参数包括(增补中):
~~~
APP_GROUP_LIST
APP_GROUP_MODE
APP_AUTOLOAD_PATH
APP_TAGS_ON
APP_GROUP_PATH
DEFAULT_APP
DEFAULT_GROUP
VAR_GROUP
LOG_DEST
LOG_EXTRA
~~~
调整的配置参数包括:
~~~
DEFAULT_MODULE => DEFAULT_CONTROLLER
~~~
## 别名定义调整
如果你在项目中定义了自己的别名定义文件,需要在别名定义中使用命名空间,例如:
~~~
'Think\Page' => CORE_PATH.'Page'.EXT,
'Think\Auth' => CORE_PATH.'Auth'.EXT,
~~~
## 行为定义调整
如果在项目中自定义了行为定义文件,那么需要修改行为定义为命名空间方式,例如:
~~~
'app_begin'=>array('Behavior\Cron','Behavior\BrowserCheck'),
~~~
## 路由定义调整
##### 如果你的项目使用了路由功能,请参考下面的建议进行调整。
3.2版本的路由定义是针对模块的,所以路由定义需要放到模块配置文件中,把`Application/Common/config.php` 中的路由定义相关的配置参数`URL_ROUTER_ON`和`URL_ROUTE_RULES`移动到相关模块的配置文件中并作适当的调整。
> 新版中路由定义规则中不需要添加模块名,如果要在URL中隐藏模块名请参考[模块部署](http://document.thinkphp.cn/manual_3_2/module_deploy.html)章节内容。
## 命名空间调整
把项目的Application/Home/Action目录下面的所有文件,头部添加如下代码(必须是除注释以外的第一行):
~~~
namespace Home\Action;
use Think\Action;
~~~
如果你的项目使用了控制器分层的话,需要对每个分层的类库文件添加类似的代码,例如有定义Event分层的话,需要在头部添加:
~~~
namespace Home\Event;
use Think\Action;
~~~
把项目的Application/Home/Model目录下面的所有文件,头部添加如下代码(必须是除注释以为的第一行):
~~~
namespace Home\Model;
use Think\Model;
~~~
如果你的项目使用了模型分层的话,需要对每个分层的类库文件添加类似的代码,例如如果你有Service分层,需要在头部添加:
~~~
namespace Home\Service;
use Think\Model;
~~~
对类库中的代码实现中实例化对象(包括系统内置类和自定义类)的部分调整为命名空间调用的方式,例如:
~~~
new Page(...) => new \Think\Page(...)
new Pdo(...) => new \Pdo(...)
new UserModel(...) => new \Home\Model\UserModel(...)
~~~
> 用ThinkPHP内置的A/D/M方法实例化的对象代码无需调整。
如果你升级的版本是3.2.1版本,应用类库的命名空间可以无需定义,但调用系统核心类库的时候仍然需要使用命名空间的方式。
在3.2.1版本中,可以在应用配置文件中设置:
~~~
'APP_USE_NAMESPACE' => false, // 关闭应用的命名空间定义
'APP_AUTOLOAD_LAYER' => 'Action,Model', // 模块自动加载的类库后缀
~~~
设置后,应用类库无需再使用命名空间定义,只需要改成:
~~~
class UserAction extends Think\Action{
}
class UserModel extends Think\Model{
}
~~~
## 模型调整
如果在模型类的自动验证或者自动完成定义中使用了下面的常量,需要进行调整:
| 原来方式 | 新版方式 |
|-----|-----|
| MODEL_INSERT | self::MODEL_INSERT |
| MODEL_UPDATE | self::MODEL_UPDATE |
| MODEL_BOTH | self::MODEL_BOTH |
| MUST_VALIDATE | self::MUST_VALIDATE |
| EXISTS_VALIDATE | self::EXISTS_VALIDATE |
| VALUE_VALIDATE | self::VALUE_VALIDATE |
## 函数调整
原来的`halt`函数和`_404`函数已经废除,`ThrowException`也不建议使用,统一使用E函数替代。
如果你之前的项目定义了`common.php`函数文件,需要并入`Common\function.php`函数文件中。
## 方法调整
控制器类Think\Controller或者Think\Action的下列方法已经废除:
| 废除方法 | 替代方法 |
|-----|-----|
| _get('id') | I('get.id') |
| _post('id') | I('post.id') |
| _put('id') | I('put.id') |
| _param('id') | I('id') |
| _request('id') | I('request.id') |
| _cookie('id') | I('cookie.id') |
| _server('id') | I('server.id') |
| _globals('id') | I('globals.id') |
## 常量调整
下列常量已经废除:
~~~
APP_NAME // 3.2版本中无需再定义该常量
__GROUP__ // 3.2版本中可以用__MODULE__ 表示模块的URL地址
GROUP_NAME // 3.2版本中可以用 MODULE_NAME 获取当前模块名
MODE_NAME // 3.2版本中模式扩展已经废弃,参考下面的模式调整部分
~~~
## 模式调整
如果你使用了ThinkPHP的模式扩展,那么抱歉地通知您,原来的模式扩展已经废弃,命令行模式不需要单独开发,新版框架可以直接切换到命令行模式访问。如果使用了PHPRPC或者REST模式的话,请参考专题中的[RPC](http://document.thinkphp.cn/manual_3_2/rpc.html)和[RESTFul](http://document.thinkphp.cn/manual_3_2/restful.html)部分修改。如果你使用了SAE引擎扩展的话,新版在标注模式下面可以直接部署到SAE环境,无需更改。参考[SAE部分](http://document.thinkphp.cn/manual_3_2/sae.html)说明。
下面的模式暂时不提供支持:
~~~
Lite
Thin
Amf
~~~
## 自定义驱动调整
如果你在项目中自定义了相关驱动,包括数据库、标签库等,那么请参考[驱动扩展](http://document.thinkphp.cn/manual_3_2/driver_extend.html)部分进行调整。
## 模板调整
默认的模板替换行为只支持下列替换规则:
~~~
'__ROOT__' => __ROOT__, // 当前网站地址
'__APP__' => __APP__, // 当前应用地址
'__MODULE__' => __MODULE__,
'__ACTION__' => __ACTION__, // 当前操作地址
'__SELF__' => __SELF__, // 当前页面地址
'__CONTROLLER__'=> __CONTROLLER__,
'__URL__' => __CONTROLLER__,
'__PUBLIC__' => __ROOT__.'/Public',// 站点公共目录
~~~
对于废除的替换规则你可以在模块的配置文件中自行添加,例如:
~~~
'TMPL_PARSE_STRING'=>array(
'../Public'=> MODULE_PATH.'View/Public/',
'__TMPL__' => MODULE_PATH.'View/default/'
)
~~~
## 入口文件调整
如果你的原来项目的入口文件中(之前备份的index_old.php)还有其他代码,请调整合并到新的入口文件中,然后建议你开启调试模式后运行新的入口文件,如果仍然有错误发生,请根据错误提示进行下一步的调整或者到官网讨论区给我们反馈。
升级成功后记得删除ThinkPHP_old和原来的项目目录。
**希望您的项目能够升级顺利!**
- 序言
- 基础
- 获取ThinkPHP
- 环境要求
- 目录结构
- 入口文件
- 自动生成
- 模块
- 控制器
- 开发规范
- 配置
- 配置格式
- 配置加载
- 读取配置
- 动态配置
- 扩展配置
- 批量配置
- 架构
- 模块化设计
- URL模式
- 多层MVC
- CBD模式
- 命名空间
- 自动加载
- 应用模式
- 项目编译
- 系统流程
- 路由
- 路由定义
- 规则路由
- 正则路由
- 静态路由
- 闭包支持
- 实例说明
- 控制器
- 控制器定义
- 前置和后置操作
- Action参数绑定
- 伪静态
- URL大小写
- URL生成
- AJAX返回
- 跳转和重定向
- 输入变量
- 请求类型
- 空操作
- 空控制器
- 插件控制器
- 操作绑定到类
- 模型
- 模型定义
- 模型实例化
- 字段定义
- 连接数据库
- 切换数据库
- 分布式数据库支持
- 连贯操作
- WHERE
- TABLE
- ALIAS
- DATA
- FIELD
- ORDER
- LIMIT
- PAGE
- GROUP
- HAVING
- JOIN
- UNION
- DISTINCT
- LOCK
- CACHE
- COMMENT
- RELATION
- USING
- fetchSql
- TOKEN
- STRICT
- INDEX
- 命名范围
- CURD操作
- 数据创建
- 数据写入
- 数据读取
- 数据更新
- 数据删除
- ActiveRecord
- 字段映射
- 查询语言
- 查询方式
- 表达式查询
- 快捷查询
- 区间查询
- 组合查询
- 统计查询
- SQL查询
- 动态查询
- 子查询
- 自动验证
- 自动完成
- 参数绑定
- 虚拟模型
- 模型分层
- 视图模型
- 关联模型
- 高级模型
- Mongo模型
- 视图
- 模板定义
- 模板主题
- 模板赋值
- 模板渲染
- 获取模板地址
- 获取内容
- 模板引擎
- 模板
- 变量输出
- 系统变量
- 使用函数
- 默认值输出
- 使用运算符
- 标签库
- 模板继承
- 修改定界符
- 三元运算
- 包含文件
- 内置标签
- Volist标签
- Foreach标签
- For标签
- Switch标签
- 比较标签
- 范围判断标签
- IF标签
- Present标签
- Empty标签
- Defined标签
- Assign标签
- Define标签
- 标签嵌套
- import标签
- 使用PHP代码
- 原样输出
- 模板注释
- 模板布局
- 模板替换
- 调试
- 调试模式
- 异常处理
- 日志记录
- 页面Trace
- Trace方法
- 变量调试
- 性能调试
- 错误调试
- 模型调试
- 缓存
- 数据缓存
- 快速缓存
- 查询缓存
- 静态缓存
- 安全
- 输入过滤
- 表单合法性检测
- 表单令牌
- 防止SQL注入
- 目录安全文件
- 保护模板文件
- 上传安全
- 防止XSS攻击
- 其他安全建议
- 扩展
- 类库扩展
- 驱动扩展
- 缓存驱动
- 数据库驱动
- 日志驱动
- Session驱动
- 存储驱动
- 模板引擎驱动
- 标签库驱动
- 行为扩展
- 标签扩展
- Widget扩展
- 应用模式
- 部署
- PATH_INFO支持
- URL重写
- 模块部署
- 域名部署
- 入口绑定
- 替换入口
- 专题
- SESSION支持
- Cookie支持
- 多语言支持
- 数据分页
- 文件上传
- 验证码
- 图像处理
- RESTFul
- RPC
- SAE
- IP获取和定位
- 附录
- 常量参考
- 配置参考
- 升级指导
- 鸣谢