ThinkPHP3.2升级为ThinkPHP5.1日志

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

 

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

 

第三步:代码目录全部改成小写(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 );

 

 

方法重写时,如果父级的方法带参数,那么重写的方法也需要定义一样的参数才行,:

如果按之前的写法重写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

 

$add_url || 全部替换成: isset($add_url) ||

$del_url || 全部替换成: isset($del_url) ||

把 $search_url || 全部替换成: isset($search_url) ||

把 $post_url || 全部替换成: 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( 具体要看实际情况而定

 

mysqldump -u weixinhong -p -d paiqianos > /root/os.sql

 

在配置文件里把 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里的Base

 

I ( '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函数已经删除,需要全站替换成S函数

 

getById方法不存在,需要全部修改成find

 

get_table_name ( $model ['id'] ) $model ['name']

然后删除 get_table_name函数

 

功能组件改造成widget

你可能感兴趣的:(php)