thinkphp版本升級的相關(guān)介紹,以5.0升級到5.1為例:
先看看5.0總的目錄結(jié)構(gòu):
project?應(yīng)用部署目錄 ├—application?應(yīng)用目錄(可設(shè)置) ├—extend?擴(kuò)展類庫目錄(可定義) ├—public?WEB?部署目錄(對外訪問目錄) ├—runtime?應(yīng)用的運(yùn)行時目錄(可寫,可設(shè)置) ├—vendor?第三方類庫目錄(Composer) ├—thinkphp?框架系統(tǒng)目錄
再看看5.1總的目錄結(jié)構(gòu):
www?WEB部署目錄(或者子目錄) ├—application?應(yīng)用目錄 ├—config?應(yīng)用配置目錄 ├—route?路由定義目錄 ├—public?WEB目錄(對外訪問目錄) ├—thinkphp?框架系統(tǒng)目錄 ├—extend?擴(kuò)展類庫目錄 ├—runtime?應(yīng)用的運(yùn)行時目錄(可寫,可定制) project?應(yīng)用部署目錄 ├—application?應(yīng)用目錄(可設(shè)置) ├—extend?擴(kuò)展類庫目錄(可定義) ├—public?WEB?部署目錄(對外訪問目錄) ├—runtime?應(yīng)用的運(yùn)行時目錄(可寫,可設(shè)置) ├—vendor?第三方類庫目錄(Composer) ├—thinkphp?框架系統(tǒng)目錄 ├—vendor?第三方類庫目錄(Composer依賴庫)
通過第一層目錄我們可以看到5.1只是多了config和route目錄,說明5.1版本已經(jīng)把配置文件和路由器文件給提取出來了。
立即學(xué)習(xí)“PHP免費(fèi)學(xué)習(xí)筆記(深入)”;
下邊我們以wstmart開源商城系統(tǒng)作為例子來嘗試升級一下。
首先我們通過git導(dǎo)出最新的thinkphp5.1框架:
我們運(yùn)行一下看看結(jié)果出現(xiàn):
導(dǎo)入開源商城wstmart代碼。
相關(guān)推薦:《ThinkPHP教程》
我們把wstmart開源商城wstmart目錄下的wstmart剪切到tp5目錄下,修改一下index.php文件,讓項目直接在系統(tǒng)根目錄下運(yùn)行,再接著修改一下數(shù)據(jù)庫配置文件和打開調(diào)試功能,運(yùn)行一下:
嗯?!!居然出錯了?趕緊翻翻文檔看看。文檔再往下拉看看,嗯?好吧。原來我太心急,沒有看完,如果是從新定義入口文件的話就不能直接把原來指向public目錄的index.php文件簡單的拿過來用,還要定義一下應(yīng)用的目錄,例如:Container::get(‘app’)->path(APP_PATH)->run()->send();其中APP_PATH就是要定義的應(yīng)用的目錄,我再改改為:
Container::get('app')->path(__DIR__?.?'/wstmart/')->run()->send();
運(yùn)行看看:
終于正常了。之所以會出現(xiàn)這個結(jié)果是因為我沒有修改配置文件,告訴系統(tǒng)默認(rèn)的模塊為home,我再修改一下app.php文件的 ‘default_module’ => ‘home’,運(yùn)行看看:
嗯?這個就又是什么情況?文件明明存在啊!!!仔細(xì)核對文件,確實存在啊…一定是5.1還有一些精華的地方我又看漏了,于是又返回看文檔。來回掃蕩,來回掃蕩,終于在升級指導(dǎo)上到有這么一句話:“如果你自定義了應(yīng)用類庫的命名空間,需要改為設(shè)置環(huán)境變量APP_NAMESPACE而不是應(yīng)用配置文件,如果你使用了.env配置文件,可以在里面添加:APP_NAMESPACE = 你的應(yīng)用類庫根命名空間名”。原來如此!!
于是在系統(tǒng)下建立一個.env文件。內(nèi)容文:app_namespace=wstmart
再運(yùn)行看看:
這段話是說這個函數(shù)沒有找到。在thinkphp5.0框架里,系統(tǒng)會自動加載目錄common下的文件,在5.1里邊怎么不會自動加載了?于是我再翻翻thinkphp5.1的源代碼看看。看到有這么一行:
未定義的數(shù)組下邊?這么詭異的問題?
從下邊的出錯提示,我們可以定位到模塊home的index.php文件調(diào)用的函數(shù)getFloors里去,出錯提示是代碼:
$rs?=?Db::name('goods_cats')->where(['dataFlag'=>1,?'isShow'?=>?1,'parentId'=>['in',$ids],'isFloor'=>1]) ->field("parentId,catName,catId")->order('catSort?asc')->select();
出了問題。我們再翻文檔看看。文檔上說:
改變了查詢構(gòu)造器的數(shù)組多字段批量查詢,從原來的
where(['name'=>['like','think%'],?'id'=>['>',0],])
需要調(diào)整為
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();
果然這個錯誤就不在出現(xiàn)了。接下來是另外一個問題:
參看文檔,在thinkphp5.1中這個函數(shù)已經(jīng)修改了。我們把thinkRequest改成thinkFacadeRequest,錯誤又消失了。
下邊是錯誤:
系統(tǒng)能運(yùn)行到這里,說明程序已經(jīng)能接收并成功返回信息了。在頁面上的這個錯,應(yīng)該就是自定義標(biāo)簽wst:ads里邊出錯,導(dǎo)致沒有內(nèi)容返回了。我們按照上邊的排錯方法繼續(xù)回去調(diào)試原來是升級時候忘記配置標(biāo)簽了。我們打開template,加上代碼’taglib_pre_load’ => ‘wstmartcommonTaglibWst’,然后再刷新一下頁面:
又是熟悉的錯誤,不過這次是其他函數(shù),對于已經(jīng)找到解決辦法的錯誤,我們很容易就解決,這樣就不再累述了。基本上都是修改model里的查詢函數(shù)就可以了。按照前邊的辦法改完之后,我們就可以完成Thinkphp 5.0到5.1的升級了。
因為篇幅有限,我就不再一一截圖調(diào)試,大家升級之前要熟讀thinkphp官方的升級指導(dǎo),避免像我一樣一個坑一個坑的填,才終于完成升級。