【问题标题】:Laravel Validation Error customise format of the ResponseLaravel 验证错误自定义响应格式
【发布时间】:2016-05-07 22:43:20
【问题描述】:

我正在处理 L5 表单请求,我不只是喜欢 Taylor!好吧,我正在做一些 AJAX 请求,但我仍然想保留我的表单请求。问题是,在验证错误的情况下,Validator 只返回 422 错误响应并闪烁错误,但我的 AJAX 前端期望来自服务器的非常具体的响应格式,无论验证是否成功。

我想将验证错误的响应格式化为类似这样的内容

return json_encode(['Result'=>'ERROR','Message'=>'//i get the errors..no problem//']);

我的问题是如何格式化表单请求的响应,特别是当这不是全局而是针对特定表单请求完成时。

我用谷歌搜索过,但没有看到非常有用的信息。深挖Validator类后也试过这个方法。

// added this function to my Form Request (after rules())
    public function failedValidation(Validator $validator)
{
    return ['Result'=>'Error'];
}

还是没有成功。

【问题讨论】:

    标签: validation laravel-5


    【解决方案1】:

    \App\Exceptions\Handler

    public function render($request, Throwable $e)
    {
    
        if ($e instanceof ValidationException) {
            //custom response
            $response = [
                'success' => false,
                'message' => "validation error",
                'data' =>$e->errors()
            ];
    
            return response()->json($response, 422);
        }
    
    
        return parent::render($request, $e);
    
    }
    

    【讨论】:

      【解决方案2】:

      这受到this post 和 Shobi 的回答的启发。为什么不从 Shobi 的答案中保留 transformErrors 函数,而只需修改 Handler.php 中的 render 函数?一个示例如下所示:

      /**
       * Render an exception into an HTTP response.
       *
       * @param  Request  $request
       * @param Exception $exception
       * @return Response
       *
       * @throws Exception
       */
      public function render($request, Exception $exception)
      {
          if ($exception instanceof ValidationException) {
              return response()->json([
                  'code' => $exception->status,
                  'error' => $exception->getMessage(),
                  'message' => $this->transformErrors($exception)
                  ], $exception->status);
          }
          return parent::render($request, $exception);
      }
      

      这使得invalidJson 函数变得多余,并允许对每种异常类型的自定义 json 响应添加更细粒度的区分。

      在 Laravel 6.2 上测试

      【讨论】:

        【解决方案3】:

        目前接受的答案不再有效,所以我给出了一个更新的答案。

        在 revelent FormRequest 使用 failedValidation 函数抛出自定义 exception

        // add this at the top of your file
        use Illuminate\Contracts\Validation\Validator; 
        use App\Exceptions\MyValidationException;
        
        protected function failedValidation(Validator $validator) {
            throw new MyValidationException($validator);
        }
        

        app/Exceptions 中创建您的自定义异常

        <?php
        
        namespace App\Exceptions;
        
        use Exception;
        use Illuminate\Contracts\Validation\Validator;
        
        class MyValidationException extends Exception {
            protected $validator;
        
            protected $code = 422;
        
            public function __construct(Validator $validator) {
                $this->validator = $validator;
            }
        
            public function render() {
                // return a json with desired format
                return response()->json([
                    "error" => "form validation error",
                    "message" => $this->validator->errors()->first()
                ], $this->code);
            }
        }
        

        这是我找到的唯一方法。如果有更好的方法,请发表评论。

        这在 laraval5.5 中有效,我认为这在 laravel5.4 中无效,但我不确定。

        【讨论】:

        • 一直在 L5.4 中使用已接受的答案(由我 :)),并且尚未在 5.4+ 中对其进行测试,所以如果您给出的答案有效,那很好。
        【解决方案4】:

        如果您使用的是 laravel 5+,您可以通过覆盖 App/Exceptions/Handler.php 文件中的 invalid()invalidJson() 方法轻松实现这一目标

        在我的例子中,我正在开发一个 API,并且 api 响应应该采用特定格式,所以我在 Handler.php 文件中添加了以下内容。

        /**
             * Convert a validation exception into a JSON response.
             *
             * @param  \Illuminate\Http\Request  $request
             * @param  \Illuminate\Validation\ValidationException  $exception
             * @return \Illuminate\Http\JsonResponse
             */
            protected function invalidJson($request, ValidationException $exception)
            {
                return response()->json([
                    'code'    => $exception->status,
                    'message' => $exception->getMessage(),
                    'errors'  => $this->transformErrors($exception),
        
                ], $exception->status);
            }
        
        // transform the error messages,
            private function transformErrors(ValidationException $exception)
            {
                $errors = [];
        
                foreach ($exception->errors() as $field => $message) {
                   $errors[] = [
                       'field' => $field,
                       'message' => $message[0],
                   ];
                }
        
                return $errors;
            }
        

        【讨论】:

        • 有趣。想试试这个,看看它是如何工作的
        • 好主意。工作正常!
        【解决方案5】:

        在这里找到答案:Laravel 5 custom validation redirection
        您需要做的就是在您的表单请求中添加一个response() 方法,它将覆盖默认响应。在您的response() 中,您可以以任何您想要的方式重定向。

        public function response(array $errors)
        {
            // Optionally, send a custom response on authorize failure 
            // (default is to just redirect to initial page with errors)
            // 
            // Can return a response, a view, a redirect, or whatever els
            return response()->json(['Result'=>'ERROR','Message'=>implode('<br/>',array_flatten($errors))]); // i wanted the Message to be a string
        }
        

        L5.5+ 更新
        此错误和公认的解决方案适用于 L5.4。对于 L5.5,使用上面 Ragas 的答案(failedValidation() 方法)

        【讨论】:

        • 除了您概述的内容之外,您是否还需要做其他事情?我正在尝试您的解决方案,当我收到回复时,json 结构与我的格式化回复相去甚远……请参阅stackoverflow.com/questions/42100798/…
        • 我不需要做任何其他事情,从那以后它一直运作良好。自从您在那里接受了答复后,您的案件似乎已经得到处理。
        • 无论谁对此投了反对票,都可以提出问题所在,甚至提出更好的答案。
        • 嗨。这似乎已经停止使用 Laravel 5.4。在 5.5 中有一个名为 failedValidation 的方法,理想情况下应该这样做!
        猜你喜欢
        • 2017-01-20
        • 2018-06-17
        • 2018-12-28
        • 2019-02-03
        • 2011-08-30
        • 2013-12-26
        • 2018-04-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多