TP3.2系统升级到5.1的教程

浏览:7843 发布日期:2019/06/20 分类:ThinkPHP5专区 关键字: 升级
ThinkPHP5.1已经趋于稳定,是时候把之前基于ThinkPHP3.2开发的老系统们升级下了。

因为最近我们有一个系统需要升级,因此我们专门就升级过程中录制了系列教程,各位可以在这里查看(https://www.weiphp.cn/home/index/course_detail/id/5/pbid/21)

下面是升级需要修改的部分要点,可能不全:

第一步:备份代码和数据库

第二步:合并插件和应用代码

第三步:代码目录全部改成小写(Uploads除外,可下载附件统一处理)


第四步:控制器和模型的PHP文件改名
把controller目录下的文件名人全部由 ***Controller.class.php 改成 ***.php, 如:ActionController.class.php 改成 Action.php。把model目录下的文件名人全部由 ***Model.class.php 改成 ***.php, 如:ActionModel.class.php 改成 Action.php。

第五步:把view/default的模板目录修改成 view/ (相当去掉default这一层目录)


第六步:手工批量更新以下内容

把这些controller文件里的命名空间由
namespace Admin\Controller; 全部替换成 namespace app\admin\controller;

把类定义由 class ***Controller extends *** 修改成 class *** extends ***,如:
class ActionController extends 全部替换成 class Action extends

把extends AdminController 修改成 extends Admin
把 use Think\Controller; 修改 use think\Controller;

把这些model文件里的命名空间由
namespace Admin\Model; 全部替换成 namespace app\admin\model;

把类定义由 class ***Model extends *** 修改成 class *** extends ***,如:
class ActionModel extends 全部替换成 class Action extends

把use Think\Model; 修改成(注意大小定):use think\Model;

直接使用M或者db函数保存数据时save不能再,需要把save替换成update方法,如:
M('attribute')->where(array('name'=>'addon_status'))->save(array('extra'=>$tmpStr));
修改成:
M('attribute')->where(array('name'=>'addon_status'))->update(array('extra'=>$tmpStr));

在模型中,save既表示增加数据也表示更新数据,在TP3.2升级的用户建议在已有save方法前加入显性更新操作,如:->save( 替换成 ->isUpdate(true)->save(

对象名不能为Public,所以 Public.php 需要改名为 Publics.php
class Public extends 修改为 class Publics extends
还要把相关的Url的地址由 Public/** 修改为 Publics/***
最后把Public.php文件删除
把模板下的public目录 修改为 publics,然后把里面的公共html文件的路径全部修改为publics/:
Public/base => publics/base
删除view下面的public目录

把所有的 extends \Think\Controller 修改为 extends \think\Controller

model文件里的验证规则不再可用,需要另写验证器实现,因此需要删除这个多余的代码,如删除下面这个:    protected $_validate = array(
        array('name', 'require', '标识不能为空', self::EXISTS_VALIDATE, 'regex', self::MODEL_BOTH),
        array('name', '', '标识已经存在', self::VALUE_VALIDATE, 'unique', self::MODEL_BOTH),
        array('title', 'require', '名称不能为空', self::MUST_VALIDATE , 'regex', self::MODEL_BOTH),
    );
把所有IS_POST 替换为:request()->isPost()
把所有IS_GET 替换为:request()->isGet()
把所有IS_AJAX 替换为:request()->isAjax()

把Controller文件里的 $this->display( 全部修改成 return $this->fetch(
所有 $this->redirect( 函数调用修改成 return $this->redirect(
所有 redirect( 函数调用修改成 return redirect(

把model里的->getField( 修改 ->value(
把model里的->getFields( 修改 ->column(
把model里的->add( 修改 ->save(,如果是用M函数增加的数据,要修改成 ->insert(

在application/common.php 文件里加入单字母函数兼容函数,并且把weiphp里的application/Common/Common.php里的函数也复制过来

在config目录下增加一个define.php文件,专门用于一些兼容性的常量定义


模板标签的规则由:
// 标签库标签开始标记
'taglib_begin' => '<',
// 标签库标签结束标记
'taglib_end' => '>',
升级TP5的规则为:
// 标签库标签开始标记
'taglib_begin' => '{',
// 标签库标签结束标记
'taglib_end' => '}',
需要把所有的模板标签全部替换

把Common/Public 全部替换成 common/Publics

$this->success 和 $this->error 的返回值发生了变化,其中:status => core
info => msg
这部分内容需要手工一个一个确认修改,无法批量替换(PS:已在TP核心里加了兼容,不需要再修改)


TP5的模板中不再支持include里加block标签,所以要把所有include里的block转换出来

TP5中的模型中的find方法返回的不再是数组,而是对象,因此不能用is_array判断返回的结果。但这个返回的对象还可以当数组用。


is_array肯定是为false,因此要去掉。但dump($user['nickname']);这样打印用户昵称时还是能正常显示出来的。也可以在把结果转换数组如:->find()->toArray();

模型中的join写法由:M()->table($px . 'public_follow as f')
            ->join($px . 'user as u ON f.uid=u.uid')
            ->where($map)
            ->count();
修改成:M()->table($px . 'public_follow')->alias('f')
            ->join($px . 'user u', 'f.uid=u.uid')
            ->where($map)
            ->count();
在application/database.php里定义一个常量:
define('DB_PREFIX', 'wp_');
然后把所有 C ( 'DB_PREFIX' ) 变量全部修改成: DB_PREFIX

把所以模型里的 protected $tableName = '***'; 替换成: protected $table = DB_PREFIX.'***';

使用preg_replace时可能会报以下错误:preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead解决方法如:$msg = preg_replace ( "#\\\u([0-9a-f]+)#ie", "iconv('UCS-2','UTF-8', pack('H4', '\\1'))", $msg );修改成:$msg = preg_replace_callback ( "#\\\u([0-9a-f]+)#i", function($r) { return iconv('UCS-2','UTF-8', pack('H4', '\\1'));}, $msg );方法重写时,如果父级的方法带参数,那么重写的方法也需要定义一样的参数才行,如:protected function lists($model = null, $page = 0)如果按之前的写法重写lists方法:protected function lists()就会报错误:Declaration of app\topmenu\Controller\TopMenu::lists() should be compatible with app\common\controller\Base::lists($model = NULL, $page = 0)解决方法就是只能把父级方法修改修改成不带参数的

其它几个通用方法edit,add,del,config也同样这样处理

把Home模块下的Addons, base, Public目录下的模板全部转移到 common/view/base 目录下,然后:
把 base/common 全部替换成: common@base/common
把 Public/header 全部替换成: common@base/header
把 Public/head 全部替换成: common@base/head
把 Public/footer 全部替换成: common@base/footer
把 Public/var 全部替换成: common@base/var
把 Addons/_nav 全部替换成: common@base/_nav
base/no_side_common => common@base/no_side_common

把全部 _ADDONS 替换成:MODULE_NAME
把全部 _CONTROLLER 替换成:CONTROLLER_NAME
把全部 _ACTION 替换成:ACTION_NAME

把 <php> $add_url || 全部替换成: <php> isset($add_url) ||
把 <php> $del_url || 全部替换成:<php> isset($del_url) ||
把 $search_url || 全部替换成:<php> isset($search_url) ||
把 $post_url || 全部替换成:<php> isset($post_url) ||
把 $get_param[model]=$model['name'] 全部替换成 isset($model['name']) && $get_param[model]=$model['name']
把 $_REQUEST ['_addons'] 全部替换成:MODULE_NAME
把 $_REQUEST ['_controller'] 全部替换成:CONTROLLER_NAME
把 $_REQUEST ['_action'] 全部替换成: ACTION_NAME

把 public/Home下的文件转移到 public/static/base目录下,然后把相应的文件目录全部更改过来:Public/Home/images => public/static/base/images
SITE_PATH . '/Addons/' => APP_PATH . '/'

$get_param[model] => $get_param['model']
$this->display( => return $this->fetch(
parent::common_edit => return parent::common_edit 
parent::common_add => return parent::common_add 
parent::common_del => return parent::common_del 
parent::common_lists => return parent::common_lists
$field[name] => $field['name'] 
$field[value]  => $field['value']
在TP3.2的模型中,create方法但创建数据对象 但不保存到数据库;在TP5中,create方法是创建并写入数据库,并返回数据实例。因此所有用到create方法的地方都需要修改,如:         if ($Model->create() && $id = $Model->save()) {修改成:            $data = I('post.');
            $id = $Model->isUpdate(false)->save($data);
            if ($id) {
User/logout => home/User/logout
User/profile => home/User/profile
'User/login' => 'home/User/login'
把 ->getField( 修改成 ->value( 或者 ->column( 具体要看实际情况而定


在配置文件里把 var_page 的参数设置为 p,然后全部替换:
C('VAR_PAGE') => C('paginate.var_page')
把所有用到\Think\Page实现分页的方法全部改造成paginate

把 selectPage 替换成 paginate,相应的调用代码需要手工修改,如:$list = M ( 'article_style')->selectPage(15);修改成:        $list = M ( 'article_style')->paginate(15);
                $list = dealPage($list);
如果使用Model调用,也可以使Model继承Common里的baseI ( 'get.  =>  I ( '
$info[addon] => $info['addon']
$vo[is_admin] =>   $vo['is_admin']

ONETHINK_ADDON_PATH =>  APP_PATH
addon_category => app_category
Addons://  => 
/Model  =>  /model
 './Addons/ =>  APP_PATH.'
T函数已经不存在,需要全部搜索调用 T( 的地方修改掉

把应用下的model文件里的update方法与核心文件冲突,需要更改成别的名称:updateInfo 然后把调用这些地方的都统一更新

不能直接使用:->delete ( $id ) 删除数据,需要修改成:->where('id='.$id)->delete ( )

F函数已经删除,需要全站替换成其它缓存函数

getById方法不存在,需要全部修改成find
最佳答案
评论( 相关
后面还有条评论,点击查看>>