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