ThinkPHP 5.0升級到ThinkPHP 5.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 應用的執行時目錄(可寫,可定製) project 應用部署目錄 ├—application 應用目錄(可設定) ├—extend 擴充套件類庫目錄(可定義) ├—public WEB 部署目錄(對外訪問目錄) ├—runtime 應用的執行時目錄(可寫,可設定) ├—vendor 第三方類庫目錄(Composer) ├—thinkphp 框架系統目錄 ├—vendor 第三方類庫目錄(Composer依賴庫)
通過第一層目錄我們可以看到5.1只是多了config和route目錄,說明5.1版本已經把配置檔案和路由器檔案給提取出來了。
下邊我們以wstmart開源商城系統作為例子來嘗試升級一下。
首先我們通過git匯出最新的thinkphp5.1框架:
我們執行一下看看結果出現:
匯入開源商城wstmart程式碼。
我們把wstmart開源商城wstmart目錄下的wstmart木剪下到tp5目錄下,修改一下index.php檔案,讓專案直接在系統根目錄下執行,再接著修改一下資料庫配置檔案和開啟除錯功能,執行一下:
嗯?!!居然出錯了?趕緊翻翻文件看看。文件再往下拉看看,嗯?好吧。原來我太心急,沒有看完,如果是從新定義入口檔案的話就不能直接把原來指向public目錄的index.php檔案簡單的拿過來用,還要定義一下應用的目錄,例如:Container::get('app')->path(APP_PATH)->run()->send();其中APP_PATH就是要定義的應用的目錄,我再改改為:
Container::get('app')->path(__DIR__ . '/wstmart/')->run()->send();
執行看看:
終於正常了。之所以會出現這個結果是因為我沒有修改配置檔案,告訴系統預設的模組為home,我再修改一下app.php檔案的 'default_module' => 'home',執行看看:
嗯?這個就又是什麼情況?檔案明明存在啊!!!仔細核對檔案,確實存在啊...一定是5.1還有一些精華的地方我又看漏了,於是又返回看文件。來回掃蕩,來回掃蕩,終於在升級指導上到有這麼一句話:“如果你自定義了應用類庫的名稱空間,需要改為設定環境變數APP_NAMESPACE而不是應用配置檔案,如果你使用了.env配置檔案,可以在裡面新增:APP_NAMESPACE = 你的應用類庫根名稱空間名”。原來如此!!
於是在系統下建立一個.env檔案。內容文:app_namespace=wstmart
再執行看看:
這段話是說這個函式沒有找到。在thinkphp5.0框架裡,系統會自動載入目錄common下的檔案,在5.1裡邊怎麼不會自動載入了?於是我再翻翻thinkphp5.1的原始碼看看。看到有這麼一行:
未定義的陣列下邊?這麼詭異的問題?
從下邊的出錯提示,我們可以定位到模組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();
果然這個錯誤就不在出現了。接下來是另外一個問題:
參看文件,在thinkphp5.1中這個函式已經修改了。我們把thinkRequest改成thinkFacadeRequest,錯誤又消失了。
下邊是錯誤:
系統能執行到這裡,說明程式已經能接收併成功返回資訊了。在頁面上的這個錯,應該就是自定義標籤wst:ads裡邊出錯,導致沒有內容返回了。我們按照上邊的排錯方法繼續回去除錯原來是升級時候忘記配置標籤了。我們開啟template,加上程式碼'taglib_pre_load' => 'wstmartcommonTaglibWst',然後再重新整理一下頁面:
又是熟悉的錯誤,不過這次是其他函式,對於已經找到解決辦法的錯誤,我們很容易就解決,這樣就不再累述了。基本上都是修改model裡的查詢函式就可以了。按照前邊的辦法改完之後,我們就可以完成Thinkphp 5.0到5.1的升級了。
因為篇幅有限,我就不再一一截圖除錯,大家升級之前要熟讀thinkphp官方的升級指導,避免像我一樣一個坑一個坑的填,才終於完成升級。