【问题标题】:Repopulating user inputs after successful validation成功验证后重新填充用户输入
【发布时间】:2015-12-05 15:59:21
【问题描述】:

我正在尝试创建一个搜索表单,用户必须在其中从一些下拉菜单中进行选择并在几个字段之一中输入文本。问题是我正在重新显示搜索页面及其下方的结果。为此,我没有重定向,我只是返回一个视图,其中包含我需要与它一起压缩的数据集。

在验证失败后重定向时,是否有任何方法可以检索输入,类似于 Input::old('x')?

路线是:

Route::get('search', ['as' => 'main.search.get', 'uses' => 'MainController@showSearchPage']);

Route::post('search', ['as' => 'main.search.post', 'uses' => 'MainController@showSearchResults']); 

我在视图中的代码示例:

 {!! Form::open(array('route' => 'main.search.post', 'class' => 'form-inline align-form-center', 'role' => 'form')) !!}

 <div class="form-group">
    {!! Form::label('product_code', 'Product Code: ',['class' => 'control-label  label-top']) !!}
    {!! Form::text('product_code', Input::old('product_code'), ['class' => 'form-control input-sm']) !!}
</div>

因此,当您提交搜索时,它会调用 showSearchResults,如果成功则返回一个视图,如果通过我的 SearchRequest 类验证失败,它将重定向到 main.search.get 路由,打印错误并将输入返回到田野。

我已经做了很多搜索并且或多或少地空手而归,如果在返回视图(而不是重定向)或其他东西时有办法说 ->withInput() 那就太好了。

目前我唯一的解决方案是 Input::flash() 但由于我没有重定向数据,因此数据会持续进行额外刷新。在这一点上这并不是什么大不了的事,但我想知道是否有其他人有更好的解决方案。

编辑 - 来自返回视图的控制器的以下代码:

...

   Input::flash();
   return view('main.search', compact('results', 'platformList', 'versionList', 'customerList', 'currencyList', 'customer', 'currency'));
}

谢谢

【问题讨论】:

  • 你能显示控制器的方法代码吗?看起来你在重定向之前忘记了一步,因为 laravel 实际上可以做到这一点。
  • 我没有重定向,我正在返回视图,这就是我遇到问题的全部原因,我没有重定向,只是返回视图。
  • 你在使用javascript吗?返回视图时我没有看到代码
  • 我在上面添加了一个 sn-p 从控制器返回它。目前它显示了我的解决方法(使用 Input::flash())
  • 一个问题,您是通过表单元素提交搜索数据吗?

标签: validation laravel redirect blade laravel-5.1


【解决方案1】:

我遇到了同样的问题。对我有用的解决方案是将以下行添加到控制器中。

session(['_old_input' => $request->input()]);

现在我将解释它是如何工作的。

在视图中,调用了全局函数old()

<input type="username" id="username" class="form-control" name="username" value="{{ old('username') }}" placeholder="Username" autofocus>

这个函数在vendor/laravel/framework/src/Illuminate/Foundation/helpers.php

function old($key = null, $default = null)
{
    return app('request')->old($key, $default);
}

这调用 Illuminate\Http\Request->old()

public function old($key = null, $default = null)
{
    return $this->session()->getOldInput($key, $default);
}

调用Illuminate\Session\Store->getOldInput()

public function getOldInput($key = null, $default = null)
{
    $input = $this->get('_old_input', []);
    return Arr::get($input, $key, $default);
}

此调用正在会话中寻找 _old_input。所以解决方案是使用这个值将输入添加到会话中。

希望这会有所帮助。

【讨论】:

  • 实际上这个解决方案导致输入被永久存储在用户会话中,直到他们输入新的东西。我只希望将输入保留在一次提交的字段中,我上面提到的 Input::flash() 的使用将其保留为两次重新加载,这很烦人但可行,您的解决方案将其永久保留,因为您将其放入会话永久,而不是一闪而过。不过,您的答案格式很棒,我学到了一些有关 Laravel 内部的知识。 :-)
  • 我同意。我认为您的解决方案更好。我实际上在我的代码中用你的答案替换了我的 sn-p :)
【解决方案2】:

您可以使用request 而不是old,因为它是发布请求

change {{old('product_code')}} to {{request('product_code')}}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多