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

 

把 <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( 具體要看實際情況而定

 

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

發佈了37 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章