Laravel 在使用 $request->validate 时不显示验证错误

问题描述

使用 $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我正确地重定向上一页(如果我的表单通过验证,我应该看到 {{1} } 输出),但不显示错误消息。我也试过 dd 并且 ErrorBag 实际上是空的。

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

dd($errors)

我看到了错误消息。

我真的无法理解这种行为。我在我的应用中将 $rules = [ 'dummy-field' => 'required|string',]; $validator = Validator::make($request->all(),$rules); if ($validator->fails()) { return redirect()->back()->withErrors($validator); } dd($validator); 用于其他表单,我没有遇到任何问题。

我使用的是 Laravel 8。

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

解决方法

我终于找到了解决方案。把它贴在这里以防它可能对某人有帮助。

问题出在 cookie 会话驱动程序

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...