【问题标题】:Redirect with session from FormRequest Laravel使用来自 FormRequest Laravel 的会话重定向
【发布时间】:2019-11-18 02:55:18
【问题描述】:

我在控制器内部执行验证,从那里我可以通过会话返回消息。

return redirect()->back()
            ->withErrors($validator)
            ->with([
                'editModal' => 'editModal',
                'msg'       => $msg
            ]);

然后,我尝试在 Laravel 中使用 FormRequest。这FormRequest 有效,但如果验证失败,我想用会话发送一些数据。但我找不到办法做到这一点。我可以使用$validator->errors()->add 发送消息,但是有没有办法通过会话发送消息,就像我在控制器中使用with() 一样?

【问题讨论】:

    标签: php laravel laravel-validation


    【解决方案1】:

    您可以在验证器错误中添加自定义错误

    $validator->errors()->add('editModal', 'editModal');
    $validator->errors()->add('msg', $msg);
    return redirect()->back()->withErrors($validator);
    

    在你的刀片中

    @if($errors->any())
     <h4>{{$errors->first()}}</h4>
    @endif
    

    【讨论】:

      【解决方案2】:

      FormRequest::failedValidation() 方法抛出 \Illuminate\Validation\ValidationException 的实例以指示验证失败。

      Illuminate\Foundation\Exceptions\Handler 中有两种方法可以处理为这些异常构建响应。您需要覆盖这两个方法,invalid()invalidJson(),以包含您的会话数据。

      这些覆盖属于您应用的异常处理程序,可在 app/Exception/Handler.php 中找到,应该如下所示:

      protected function invalid($request, ValidationException $exception)
      {
          return redirect($exception->redirectTo ?? url()->previous())
                      ->withInput(Arr::except($request->input(), $this->dontFlash))
                      ->withErrors($exception->errors(), $exception->errorBag)
                      ->with([
                          'editModal' => 'editModal',
                          'msg'       => $msg
                      ]);
      }
      
      protected function invalidJson($request, ValidationException $exception)
      {
          return response()
              ->json([
                  'message' => $exception->getMessage(),
                  'errors' => $exception->errors(),
              ], $exception->status)
              ->with([
                  'editModal' => 'editModal',
                  'msg'       => $msg
              ]);
      
      }
      

      【讨论】:

      • 不幸的是,getResponse() 将返回null,因为没有$response 作为第二个参数传递给ValidationException 的构造函数……您可以构建一个响应对象并将其传递给
      • 谢谢,我没注意到。尝试另一种方法。
      • 如果您分配一个响应,即异常处理程序返回的内容,处理程序现在不会为您构建响应...您将需要响应作为重定向响应到您所在的位置希望它与withInput(...)-&gt;withErrors(...) 通话一起使用;您需要构建将返回的完整响应...有趣有趣:)
      • 哈哈,除非你的名字是泰勒,我不怪你。看起来您是对的,无论出于何种原因,所有重定向和错误内容都在Illuminate/Foundation/Exceptions/Handler 中完成。 OP此时最好将其保留在控制器中。早上去看看。
      • 大声笑,我想我会使用你的建议:将它保存在控制器中。
      【解决方案3】:

      花了我的时间后,我找到了一种通过会话发送消息的方法。只需在您使用的FormRequest 类上添加此函数即可。

      protected function failedValidation(Validator $validator)
      {
          return redirect()->back()
              ->withErrors($validator)
              ->with([ //these are my messages
                  'editModal' => 'editModal',
                  'msg'       => $this->input()
              ]);
      }
      

      别忘了use Illuminate\Contracts\Validation\Validator;

      【讨论】:

      • 这不会返回正确的 HTTP 状态代码,也不会包含旧值。
      • 我在我的案例中使用了 session,但我尝试过,它也包含旧值。编辑:哎呀,我错了。它会导致错误。这仅适用于会话。
      猜你喜欢
      • 2019-07-01
      • 1970-01-01
      • 2020-10-08
      • 2023-03-16
      • 2019-05-19
      • 2018-09-15
      • 2021-11-29
      • 2017-06-19
      • 2018-02-18
      相关资源
      最近更新 更多