webman遇到的视图赋值问题,求解答

xiaobai1

前提:数据库使用的是thinkorm,视图使用的也是thinkphp的。

新增和编辑都使用的同一个edit.html,在这个html里面,有类似于
<input type="text" name="name" value="{$info.name}" />

这么一段。

正确的效果是:点击新增的时候,这时候value是空。点击编辑的时候,php根据id获取到info,输入到视图里面,就会显示出正确的值。

但是目前遇到了这种情况,不知道是否是因为常驻内存导致的:

当我点击编辑之后,页面会显示出value的值,后续关闭了该页面。再次点击【新增】按钮,重新进入该页面的时候,有一定的概率会重新显示出这个value的值。也就是说时有时无。并且这个value的值,应该都是(目前一直都是)最后一次编辑的那个的值,感觉就好像这个值没有被销毁,还一直存在着,但是并不是每次【新增】它都一定出现,很奇怪,请求解答一下,谢谢了!

2297 2 0
2个回答

walkor

模版变量不会常驻内存。
这个问题可能是业务bug。

  • xiaobai1 2021-01-13

    我重新安装了一个webman写了个测试demo,如果用原生模板引擎是没有任何问题的,切换到think-template就会出现这个问题,可能是think-template的问题或者是两者不兼容吧

xiaobai1

经过测试发现,如果模板引擎选择了ThinkTemplate,会出现以下问题:

假设有2个页面,分别为a.html和b.html

a方法里面 return view('index/a');
b方法里面 return view('index/b', ['name' => 'wo shi b']);

a.html 和 b.html 里面的内容都是 : {$name}

如果先访问a,会报错,因为没有name变量。
访问b,会输出 wo shi b
关键来了,如果此时再次访问a,也会输出 wo shi b

如果等待一定的时间重新访问a,a会报错。

也许是ThinkTemplate对变量进行了缓存(但是我没有找到相关的关闭方式,试了配置项的缓存,好像也没起作用),当你定义了一个变量,在一定的时间内,你如果访问其他的页面,如果此页面也有这个变量(虽然都是name,但是可能代表的含义并不同),并且此页面的变量在某种情况下没有被重新赋值的话,会导致业务错误,b的name会错误的显示到a的页面中。

如果业务代码很严谨的话,倒也不会出现这种问题。例如将a改为 return view('index/a', ['name' => '']);

虽然说和自己的代码严谨性有关,但是使用原生、Twig都不会出现这种情况,所以也和ThinkTemplate有一定关系吧,正常来说,走完这个页面,生命周期应该结束,变量也就不应该继续存在了,也可能是有配置项我没有发现吧

稍微整理了一下,希望其他人不要遇到这个问题了,如果遇到了,可以在这里找到答案。如果有其他解决方案,希望可以留言解惑,谢谢啦

年代过于久远,无法发表回答
🔝