前提:數(shù)據(jù)庫(kù)使用的是thinkorm,視圖使用的也是thinkphp的。
新增和編輯都使用的同一個(gè)edit.html,在這個(gè)html里面,有類似于
<input type="text" name="name" value="{$info.name}" />
這么一段。
正確的效果是:點(diǎn)擊新增的時(shí)候,這時(shí)候value是空。點(diǎn)擊編輯的時(shí)候,php根據(jù)id獲取到info,輸入到視圖里面,就會(huì)顯示出正確的值。
但是目前遇到了這種情況,不知道是否是因?yàn)槌qv內(nèi)存導(dǎo)致的:
當(dāng)我點(diǎn)擊編輯之后,頁(yè)面會(huì)顯示出value的值,后續(xù)關(guān)閉了該頁(yè)面。再次點(diǎn)擊【新增】按鈕,重新進(jìn)入該頁(yè)面的時(shí)候,有一定的概率會(huì)重新顯示出這個(gè)value的值。也就是說(shuō)時(shí)有時(shí)無(wú)。并且這個(gè)value的值,應(yīng)該都是(目前一直都是)最后一次編輯的那個(gè)的值,感覺(jué)就好像這個(gè)值沒(méi)有被銷毀,還一直存在著,但是并不是每次【新增】它都一定出現(xiàn),很奇怪,請(qǐng)求解答一下,謝謝了!
經(jīng)過(guò)測(cè)試發(fā)現(xiàn),如果模板引擎選擇了ThinkTemplate,會(huì)出現(xiàn)以下問(wèn)題:
假設(shè)有2個(gè)頁(yè)面,分別為a.html和b.html
a方法里面 return view('index/a');
b方法里面 return view('index/b', ['name' => 'wo shi b']);
a.html 和 b.html 里面的內(nèi)容都是 : {$name}
如果先訪問(wèn)a,會(huì)報(bào)錯(cuò),因?yàn)闆](méi)有name變量。
訪問(wèn)b,會(huì)輸出 wo shi b
關(guān)鍵來(lái)了,如果此時(shí)再次訪問(wèn)a,也會(huì)輸出 wo shi b
如果等待一定的時(shí)間重新訪問(wèn)a,a會(huì)報(bào)錯(cuò)。
也許是ThinkTemplate對(duì)變量進(jìn)行了緩存(但是我沒(méi)有找到相關(guān)的關(guān)閉方式,試了配置項(xiàng)的緩存,好像也沒(méi)起作用),當(dāng)你定義了一個(gè)變量,在一定的時(shí)間內(nèi),你如果訪問(wèn)其他的頁(yè)面,如果此頁(yè)面也有這個(gè)變量(雖然都是name,但是可能代表的含義并不同),并且此頁(yè)面的變量在某種情況下沒(méi)有被重新賦值的話,會(huì)導(dǎo)致業(yè)務(wù)錯(cuò)誤,b的name會(huì)錯(cuò)誤的顯示到a的頁(yè)面中。
如果業(yè)務(wù)代碼很嚴(yán)謹(jǐn)?shù)脑挘挂膊粫?huì)出現(xiàn)這種問(wèn)題。例如將a改為 return view('index/a', ['name' => '']);
雖然說(shuō)和自己的代碼嚴(yán)謹(jǐn)性有關(guān),但是使用原生、Twig都不會(huì)出現(xiàn)這種情況,所以也和ThinkTemplate有一定關(guān)系吧,正常來(lái)說(shuō),走完這個(gè)頁(yè)面,生命周期應(yīng)該結(jié)束,變量也就不應(yīng)該繼續(xù)存在了,也可能是有配置項(xiàng)我沒(méi)有發(fā)現(xiàn)吧
稍微整理了一下,希望其他人不要遇到這個(gè)問(wèn)題了,如果遇到了,可以在這里找到答案。如果有其他解決方案,希望可以留言解惑,謝謝啦
看來(lái)ThinkTemplate實(shí)例會(huì)緩存之前的變量。更新下 https://github.com/walkor/webman/blob/master/support/view/ThinkPHP.php 試下,改成了每個(gè)請(qǐng)求都重新初始化一次ThinkTemplate實(shí)例,這樣就不會(huì)有問(wèn)題了。