【问题标题】:Laravel does not display validation errors when using $request->validate使用 $request->validate 时 Laravel 不显示验证错误
【发布时间】:2021-04-30 11:44:09
【问题描述】:

使用$request->validate($rules); 时,我无法在特定表单/页面上显示验证错误。这是控制器代码:

public function store(Request $request) {

  $rules = [
    'dummy-field' => 'required|string',
  ];

  $params = $request->validate($rules);
  // $this->validate($request, $rules); // Same result with this

  dd($params);
}

在我看来:

@if($errors->any())
  <div class="alert alert-danger">
    @foreach($errors->all() as $error)
      <div>{{ $error }}</div>
    @endforeach
  </div>
@endif

当我提交表单时(没有dummy-field我被正确重定向回到上一页(如果我的表单通过验证,我应该会看到dd 输出),但不显示错误消息。我也试过dd($errors),ErrorBag 实际上是空的。

奇怪的是,使用手动验证器可以正确显示错误消息。将控制器重构为:

$rules = [
  'dummy-field' => 'required|string',
];

$validator = Validator::make($request->all(), $rules);

if ($validator->fails()) {
  return redirect()->back()->withErrors($validator);
}

dd($validator);

我看到错误消息。

我真的无法理解这种行为。我在我的应用程序中将$request-&gt;validate() 用于其他表单,我没有任何问题。

我正在使用 laravel 8。

有人知道为什么会发生这样的事情吗?

【问题讨论】:

  • 查看页面后检查会话是否存在验证错误
  • 不,会话中没有任何内容。我只有在使用 Validator::make 时才有它们
  • validate() 是 laravel 提供的辅助函数,你可以从中查看

标签: laravel laravel-validation laravel-session


【解决方案1】:

我终于找到了解决办法。在这里发布它以防它可能对某人有所帮助。

问题出在cookie会话驱动

浏览器有一个 cookie 的最大大小(我认为大约 4k,但可能会有所不同)。当使用$request-&gt;validate() 时,重定向会将错误和输入都放入会话中。如果输入足够长(在我的情况下,我有一些 textarea 大约 300 个字符的文本),cookie 将超过最大大小,浏览器将忽略它,因此 Laravel 将无法从会话中检索错误。

我无法使用file 驱动程序,因为我的应用程序分布在负载平衡器之外的多个服务器上,因此我使用redis 驱动程序解决了所有问题。

【讨论】:

    猜你喜欢
    • 2016-06-28
    • 2018-08-26
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 2012-12-14
    • 1970-01-01
    • 2019-12-31
    相关资源
    最近更新 更多