将Laravel输入数据持续到会话的优雅方式

时间:2016-05-30 22:26:43

标签: php laravel laravel-5.2

我试图找到是否有一种优雅的方式将数据从request-> input()传递到request-> session(); 。我想要实现的是接收用户输入,然后我会在后续的http请求中重复使用。

丑陋的方式:

我可以用丑陋的方式做到这一点:

$request->session()->put('name', $request->input('name'));
$request->session()->put('address', $request->input('address'));
$request->session()->put('age', $request->input('age'));
$request->session()->put('bed_time', $request->input('bed_time'));

Laravelly Way:

但是,这似乎不是非常Laravelly,我觉得应该有办法,以便我可以这样做:

$request->input()->persist();

$request->persistInput();

不幸的是,我无法在文档中找到任何能让我更好地实现此目的的方法。有没有办法实现这个目标?或者我是否坚持使用这种丑陋的不可思议的方式将数据保存到会话中?

修改:

我已接受Jeff's answer作为我问题的解决方案。这部分详细介绍了Laravelly解决这一问题的方法。

$request->flash();

以上是接收输入数据的请求的解决方案。但是在所有后续的http请求中,我需要包含以下内容,并访问这样的数据。

//This makes the data available for the next request.
$request->reflash();

// I can access the data from the last request using the 'old' method.
$name = $request->old('name');
$address = $request->old('address');

每次我想要将数据传递给另一个请求时,我需要重新刷新。

4 个答案:

答案 0 :(得分:9)

this manual page。它涵盖了闪存数据到会话以用于下一个请求,这可能是您所追求的:

AVAudioEngine

这将获取所有旧输入字段并将它们存储在会话的闪存数据中,并将它们保留在下一个请求中。例如,如果用户输入的数据未经验证且您希望使用旧数据重定向,则可以预先填充表单字段。事实上,有一种更简单的方法可以将重定向闪存同样的数据放入会话中:

$request->flash();

您甚至可以指定想要保留的数据:

return redirect()->back()->withInput();

<强>更新

感谢@Rifki在评论中指出这一点,但是如果你想保留后续HTTP请求的数据而你正在使用flash数据,那么在下一个请求中你可以告诉Laravel Session保持另一个请求的数据:

return redirect()->back()->withInput($request->except('password'));

根据此数据的生存时间,您可能只想继续将数据永久存储到会话中。在this手动输入中查看可以检索输入的不同方法:

$request->session()->reflash();

答案 1 :(得分:2)

您可以将此缩短为一行。如果您使用except方法,它将返回一个数组,这意味着您可以执行此操作:

$request->session()->put('request', $request->except('la'))

它会将数组持久保存到request会话密钥。

我还注意到其他答案为您提供了其他选择。所有这些似乎都会减少你的代码库,这很好,但我不认为它符合你的优雅&#39;标准。

在我看来,你可以缩短你的代码,使其具有“优雅”的外观,但在寻找“Laravel方式”方面却是如此。 - 据我所知,没有一个。

你所追求的是你可以在你的应用程序中使用的某种帮助函数/类,它将提供你想要的单一方法优雅。

答案 2 :(得分:2)

你快到了。

如果您要执行以下操作:

session()->put('user', request()->all());

然后以下内容应该可用并且仍然存在:

session()->get('user')->name
session()->get('user')->address

当然,既然我们正在谈论Laravel,那么有一种更优雅的方式。

您可以将以下内容放在中间件或服务提供商中:

view()->composer('*', function ($view)
{              
    if(session()->has('user')) {
        $view->with('user', session()->get('user'));                
    }
});

现在你可以像这样使用它:

$user->name
$user->address

答案 3 :(得分:1)

您可以做的是在命名空间下命名输入

<input name="user[name]">
<input name="user[address]">
<input name="user[age]">
<input name="user[bed_time]">

在您的控制器中,您只能拨打put一次:

$request->session()->put('user', $request->input('user'));

但是,如果您想传递下一个请求的数据,您可以执行以下操作:

return redirect()->route('step.two')->withInput();

这会闪现会话的输入。