開源商城WSTMart升級thinkphp5.1框架實踐

thinkhp5.0日趨穩定之後,thinkphp官方又馬不停蹄的開展了5.1版本的更新迭代。作爲技術人,一向是喜歡嘗新,既然5.1出來了,趕緊入手瞭解瞭解下。

首先打開文檔看看開發目錄有沒有變化,希望不要和3.X一樣改得面目全非了。

先看看5.0總的目錄結構:

project 應用部署目錄
├─application 應用目錄(可設置)
├─extend 擴展類庫目錄(可定義)
├─public WEB 部署目錄(對外訪問目錄)
├─runtime 應用的運行時目錄(可寫,可設置)
├─vendor 第三方類庫目錄(Composer)
├─thinkphp 框架系統目錄

再看看5.1總的目錄結構:

www WEB部署目錄(或者子目錄)
├─application 應用目錄
├─config 應用配置目錄
├─route 路由定義目錄
├─public WEB目錄(對外訪問目錄)
├─thinkphp 框架系統目錄
├─extend 擴展類庫目錄
├─runtime 應用的運行時目錄(可寫,可定製)
├─vendor 第三方類庫目錄(Composer依賴庫)

通過第一層目錄我們可以看到5.1只是多了config和route目錄,說明5.1版本已經把配置文件和路由器文件給提取出來了。

下邊我們以wstmart開源版本作爲例子來嘗試升級一下。

首先我們通過git導出最新的thinkphp5.1框架:

開源商城WSTMart升級thinkphp5.1框架實踐

thinkphp5.1框架

我們運行一下看看結果出現:

開源商城WSTMart升級thinkphp5.1框架實踐

thinkphp5.1框架運行過程

導入開源商城wstmart代碼。我們把wstmart開源商城wstmart目錄下的wstmart木剪切到tp5目錄下,修改一下index.php文件,讓項目直接在系統根目錄下運行,再接着修改一下數據庫配置文件和打開調試功能,運行一下:

開源商城WSTMart升級thinkphp5.1框架實踐

wstmart升級過程

嗯?!!居然出錯了?趕緊翻翻文檔看看。文檔再往下拉看看,嗯?好吧。原來我太心急,沒有看完,如果是從新定義入口文件的話就不能直接把原來指向public目錄的index.php文件簡單的拿過來用,還要定義一下應用的目錄,例如:Container::get('app')->path(APP_PATH)->run()->send();其中APP_PATH就是要定義的應用的目錄,我再改改爲:Container::get('app')->path(__DIR__ . '/wstmart/')->run()->send();運行看看:

開源商城WSTMart升級thinkphp5.1框架實踐

wstmart升級過程

終於正常了。之所以會出現這個結果是因爲我沒有修改配置文件,告訴系統默認的模塊爲home,我再修改一下app.php文件的 'default_module' => 'home',運行看看:

開源商城WSTMart升級thinkphp5.1框架實踐

wstmart升級過程

嗯?這個就又是什麼情況?文件明明存在啊!!!仔細覈對文件,確實存在啊...一定是5.1還有一些精華的地方我又看漏了,於是又返回看文檔。來回掃蕩,來回掃蕩,終於在升級指導上到有這麼一句話:“如果你自定義了應用類庫的命名空間,需要改爲設置環境變量APP_NAMESPACE而不是應用配置文件,如果你使用了.env配置文件,可以在裏面添加:APP_NAMESPACE = 你的應用類庫根命名空間名”。原來如此!!

於是在系統下建立一個.env文件。內容文:app_namespace=wstmart

再運行看看:

開源商城WSTMart升級thinkphp5.1框架實踐

wstmart升級過程

這短話是說這個函數沒有找到。在thinkphp5.0框架裏,系統會自動加載目錄common下的文件,在5.1裏邊怎麼不會自動加載了?於是我再翻翻thinkphp5.1的源代碼看看。看到有這麼一行:

開源商城WSTMart升級thinkphp5.1框架實踐

wstmart升級過程

從初始化文件的代碼裏我們可以知道,thinkphp5.1不在自動加載common下的文件了。於是我們在config目錄下新增一個common.php在裏邊銀引入系統所需要的公共文件。再運行看看:

開源商城WSTMart升級thinkphp5.1框架實踐

wstmart升級過程

未定義的數組下邊?這麼詭異的問題?

從下邊的出錯提示,我們可以定位到模塊home的index.php文件調用的函數getFloors裏去,出錯提示是代碼:

$rs = Db::name('goods_cats')->where(['dataFlag'=>1, 'isShow' => 1,'parentId'=>['in',$ids],'isFloor'=>1])

->field("parentId,catName,catId")->order('catSort asc')->select();

出了問題。我們再翻文檔看看。文檔上說:

  • 改變了查詢構造器的數組多字段批量查詢,從原來的

where(['name'=>['like','think%'], 'id'=>['>',0],])

需要調整爲

where([['name','like','think%'], ['id','>',0],])

我們參照上邊的說明把代碼修改爲:

$rs = Db::name('goods_cats')->where([['dataFlag','=',1], ['isShow','=',1],['parentId','in',$ids],['isFloor','=',1]])

->field("parentId,catName,catId")->order('catSort asc')->select();

果然這個錯誤就不在出現了。接下來是另外一個問題:

開源商城WSTMart升級thinkphp5.1框架實踐

wstmart升級過程

參看文檔,在thinkphp5.1中這個函數已經修改了。我們把thinkRequest改成think acadeRequest,錯誤又消失了。

下邊是錯誤:

開源商城WSTMart升級thinkphp5.1框架實踐

wstmart升級過程

系統能運行到這裏,說明程序已經能接收併成功返回信息了。在頁面上的這個錯,應該就是自定義標籤wst:ads裏邊出錯,導致沒有內容返回了。我們按照上邊的排錯方法繼續回去調試原來是升級時候忘記配置標籤了。我們打開template,加上代碼'taglib_pre_load' => 'wstmartcommon aglibWst',然後再刷新一下頁面:

開源商城WSTMart升級thinkphp5.1框架實踐

wstmart升級過程

又是熟悉的錯誤,不過這次是其他函數,對於已經找到解決辦法的錯誤,我們很容易就解決,這樣就不再累述了。基本上都是修改model裏的查詢函數就可以了。按照前邊的辦法改完之後,我們就可以完成wstmart的升級了。因爲篇幅有限,我就不再一一截圖調試,大家升級之前要熟讀thinkphp官方的升級指導,避免像我一樣一個坑一個坑的填,才終於完成升級。

下邊是thinkphp5.1的升級指導:https://www.kancloud.cn/manual/thinkphp5_1/354155

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章