我正在尝试在Laravel 5.4中为创建模型实体预先填充表单上的输入。但该表单是一个共享的刀片模板,具有相同模型的编辑表单,我希望使用表单模型绑定来提供输入。
到目前为止,我实现这一点的方法是将会话变量闪存到创建路由的控制器中的_old_input
:session()->flash('_old_input.description', $event->description);
这正是我想要的,除了在请求结束时没有被清除。我的下一个请求仍然刷新了会话数据。
我的问题是,Laravel是如何知道这是一条闪光信息的接收者,而不是输入闪光信息的?有没有办法告诉它我已经使用了会话闪存,应该在这个请求结束时清理它。。。
您需要使用重定向来刷新会话。。。否则,您将在下一个请求中保留闪光灯。。。
您可以返回视图。。。像
return redirect('view')->with('_old_input.description', $event->description);
或者你甚至可以重定向到控制器操作。。。像
session()->flash('_old_input.description', $event->description);
return redirect()->action('MyController@function');
这也会起作用。。。关键是返回重定向响应。。。
希望这能帮助。。。
Serge正确地认为,flash旨在将数据放入NEXT请求的会话中,因此重定向是正确的方法,我也将在这里提供我用来破解这一问题的解决方案。。。
Laravel将其闪存数据存储在会话阵列中的_flash
值中,在new
密钥下的NEXT请求中使用的密钥,以及在old
密钥中的THIS请求中使用过的密钥;请参阅以下摘录。
[_flash] => Array
(
[old] => Array
(
)
[new] => Array
(
[0] => _old_input
)
)
使用session()->push('_flash.old', '_old_input');
欺骗Laravel,使其认为这是从上一个请求中闪入此请求的数据,并在其周期结束时清除数据。
为了获得完整的效果,您可以使用session()->forget('_flash.new.0');
将其从新密钥中删除,尽管要注意这不一定是第一个闪烁的var(在我的情况下是)。
因此,我的总代码是:
session()->flash('_old_input', ['description' => $event->description]);
session()->push('_flash.old', '_old_input');
session()->forget('_flash.new.0');
同样,Serge是正确的,但如果有其他人来这里了解Laravel的闪光是如何工作的,并想绕过它,这里有一些信息