国产又猛又爽又黄视频|在线观看人成视频免费|少妇高潮太爽了在线视频|911国产免费无码专区|特黄做受又大又粗又长大片|欧美一级二级免费在线观看|日日夜人人澡人人澡人人看免|欧洲午夜精品一级毛片在线播放

thinkphp5因模板文件名在windows服務(wù)器正常在linux服務(wù)器報錯問題

2021-03-05 13:03 欄目:技術(shù)開發(fā) 查看(4519)

最近微構(gòu)網(wǎng)絡(luò)接手了一個從其他團(tuán)隊轉(zhuǎn)移過來的一個項目,因為客戶之前的服務(wù)團(tuán)隊解散了。在交接過程中客戶描述了一些問題,其中一個基礎(chǔ)問題就是說這個系統(tǒng)只能在windows系統(tǒng)里面運行,而在centos等linux系統(tǒng)中運行不了,直接出現(xiàn)報錯頁面。

因為在此之前我們已經(jīng)了解到該項目后端采用php+MySQL開發(fā),而且功能也沒有特別特殊的東西,理論上不存在這種兼容性問題。打開調(diào)試模式發(fā)現(xiàn)這樣的頁面:

QQ截圖20210305121716

這個報錯太正常不過了,就是提示模板文件不存在嘛,像這個項目就是典型的模板引擎實現(xiàn)邏輯上的前后端分離,但是并不是真正意義上的前后端分離。這種報錯在開發(fā)過程中太常見了。然而為什么在windows系統(tǒng)上就沒問題,而放到linux系統(tǒng)中就有問題呢?

稍微了解windows和linux系統(tǒng)的人都知道windows對大小寫不敏感,而linux系統(tǒng)對大小寫敏感。原因就在這個地方,因為上述實際報錯的模板文件名為testSql.html,文件名為駝峰命名法,其中是大寫的S。然而在調(diào)用的時候根據(jù)模板解析規(guī)則解析成了testsql,成為完全小寫的的了。

如何解決?

最笨的方式就是在對應(yīng)的控制器中把模板調(diào)用改成統(tǒng)一的名稱,這樣肯定是不會再出錯了。如果一個項目頁面數(shù)量很少,這種最笨的方式也是非常有效的一種方式,但是如果頁面數(shù)量多,那必然就希望用更快的方式來處理這個坑了。其實只要理解thinkphp的模板加載機制就能批量的解決上述問題,下面不解析具體分析過程,只給一個分析出來的結(jié)果。

可以知道進(jìn)行模板加載的核心代碼位于thinkphp\library\think\view\driver\Think.php中,而上述報錯的頁面提示的就是這個thinkphp自帶類中的fetch方法。

QQ截圖20210305124154

而真正進(jìn)行處理的則是該方法所引用的parseTemplate方法,官方給的注釋是“自動定位模板文件”,我們可以修改該方法進(jìn)行批量處理(一般情況下,不建議修改開發(fā)框架的核心源代碼;因為會給后續(xù)框架升級帶來麻煩,而且某些框架的許可協(xié)議可能不允許這么干,這里僅供思路參考)。

下面我們截取其中一小段為例來講解下,以在控制器中直接使用$this->fetch()方法加載模板為例,也就是fetch方法不傳參數(shù),而讓框架的模板加載機制自動引用模板。對應(yīng)的核心代碼就是:

$template = str_replace(‘.’, DS, $controller) . $depr . (1 == $this->config['auto_rule'] ? Loader::parseName($request->action(true)) : $request->action());

而跟最后模板文件名相關(guān)的其實就是:

1 == $this->config['auto_rule'] ? Loader::parseName($request->action(true)) : $request->action()

其中$this->config['auto_rule'] 是模板配置的一個參數(shù),它有兩個值(?1 解析為小寫+下劃線 2 全部轉(zhuǎn)換小寫,默認(rèn)是1),而$request->action()這個就是控制器的方法名,默認(rèn)是會直接全部轉(zhuǎn)化為小寫,如果傳參true會保留原始狀態(tài)。而?Loader::parseName則是把駝峰命名的大寫字母轉(zhuǎn)成小寫且在它前面加下劃線。

QQ截圖20210305125053

所以依據(jù)上述思路,對有問題的部分,進(jìn)行有標(biāo)記的進(jìn)行處理即可。比如已有的控制器對應(yīng)的模板文件名都是駝峰文件名,那么我們可以根據(jù)符合條件控制器,修改代碼:Loader::parseName($request->action(true)) 改成$request->action(true)即可,也就是不自動變成下劃線形式。具體需要修改什么得按照之前留下的坑而來的。

建議

我們寫代碼的時候一定要考慮跨平臺的兼容性和后續(xù)擴(kuò)展迭代的便利性,不要圖一時快活,隨心所欲。到頭來留下巨多的坑等待自己或者后續(xù)接手的其他開發(fā)人員,其實在整個行業(yè)內(nèi)不少的加班都是因為這樣的不嚴(yán)謹(jǐn)造成的,很多甚至出現(xiàn)死循環(huán),直到拖死整個項目。

所以建議大家有開發(fā)需求的時候,請謹(jǐn)慎選擇開發(fā)團(tuán)隊,因為并不是費用越低、速度越快的就越好,前期低的成本很可能在后續(xù)過程中付出幾倍甚至數(shù)十倍的代價。很多時候我們團(tuán)隊是不愿意接手第三方團(tuán)隊開發(fā)的后的產(chǎn)品,因為這樣的產(chǎn)品對我們和客戶來講都是性價比很低的??蛻粲X得我的東西都做好了只是存在很多使用上的問題,修改起來應(yīng)該很簡單;而實際上往往接手這樣的項目來修改比重新開發(fā)一個同樣復(fù)雜度的產(chǎn)品花費的時間和人力成本會更多。

與我們的項目經(jīng)理聯(lián)系
掃二維碼與項目經(jīng)理溝通

我們在微信上24小時期待你的聲音

解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流

轉(zhuǎn)載請注明出處:thinkphp5因模板文件名在windows服務(wù)器正常在linux服務(wù)器報錯問題 - 微構(gòu)網(wǎng)絡(luò)
分享:
標(biāo)簽: