【问题标题】:Laravel 5 Validation - Return as json / ajaxLaravel 5 验证 - 返回为 json / ajax
【发布时间】:2015-12-09 21:06:44
【问题描述】:

我正在尝试将值发布到验证中并将响应返回为 json 而不是文档中给出的return view

    $validator = Validator::make($request->all(), [
        'about' => 'min:1'
    ]);

    if ($validator->fails()) {
        return response()->json(['errors' => ?, 'status' => 400], 200);
    } 

帖子是由 ajax 制作的,所以我也需要在 ajax 中接收响应。

我发现为了防止在返回的响应中刷新页面,我必须在数组外给它一个状态码 200。但我不知道该给'errors' 部分提供什么。我应该在里面写什么?

【问题讨论】:

  • return response()->json(['errors' => $validator->messages(), 'status' => 400], 200);?
  • 小更新:现在的 REST 原则要求使用状态码 422

标签: javascript php jquery laravel laravel-5


【解决方案1】:

您可以使用$validator->messages() 返回一个数组,其中包含有关验证器的所有信息,包括错误。 json 函数获取数组并将其编码为 json 字符串。

if ($validator->fails()) {    
    return response()->json($validator->messages(), Response::HTTP_BAD_REQUEST);
}

注意:如果出现验证错误,最好不要返回响应码 200。您可以使用其他状态码,例如 400 或Response::HTTP_BAD_REQUEST

【讨论】:

  • 您不必指定 200 error_code,因为 200 是默认值。
  • 嗯。我认为我们应该将状态码设置为 200、201 以外的其他值。如果客户端使用 axios(Javascript API 库)通过 promise 处理会发生什么:D
  • 如果失败,你应该返回一个400,因为它没有成功。您还应该考虑使用响应代码常量,例如Response::HTTP_BAD_REQUEST。一个完整的例子是:return response()->json($validator->messages(), Response::HTTP_BAD_REQUEST);
  • 我们应该使用 FormRequest 验证 (laravel.com/docs/7.x/validation#form-request-validation) 而不是内联验证。请参阅通过他的回复中的链接提供的@james-mills 解决方案。
  • @user3125602 问题不在于如何验证表单。它只是关于如何返回验证错误作为响应。
【解决方案2】:

在 Laravel 5.4 中,validate() 方法可以自动检测您的请求是否为 AJAX 请求,并相应地发送验证器响应。

查看文档here

如果验证失败,将生成重定向响应以将用户发送回之前的位置。错误也将闪现到会话中,以便显示。如果请求是 AJAX 请求,将向用户返回带有 422 状态代码的 HTTP 响应,其中包括验证错误的 JSON 表示。

所以您可以简单地执行以下操作:

Validator::make($request->all(), [
    'about' => 'min:1'
])->validate();

【讨论】:

    【解决方案3】:

    我相信如果你提交一个 Ajax 请求,你会自动得到一个 JSON 响应。

    根据您的示例,也许这样的事情是合适的:

    $validator = \Validator::make($request->all(), $this->rules());
    
    if ($validator->fails()) {
       return response()->json($validator->errors(), 422)
    }
    

    【讨论】:

      【解决方案4】:

      对于那些创建了自定义请求类的人,可以重写public function response(array $errors) 方法并返回修改后的响应,而无需明确地Validator

      use Illuminate\Foundation\Http\FormRequest;
      use Illuminate\Http\JsonResponse;
      
      class CustomRequest extends FormRequest
      {
      
          public function rules()
          {
              $rules = [
                  //custom rules    
              ];
      
              return $rules;
          }
      
          public function response(array $errors)
          {
              return new JsonResponse(['error' => $errors], 400);
          }
      }
      

      【讨论】:

      • 嗯,这真的很有趣,如果你将它与$request->ajax() 结合使用,你可以处理这两种请求类型:)
      • 没错,封装起来比较好。
      【解决方案5】:

      我在现有项目中将此代码用于 API。

      $validator = Validator::make($request->all(), [ 
            'ride_id' => 'required',
            'rider_rating' => 'required',
        ]);
      
        if ($validator->fails()) {
          return response()->json($validator->errors(), 400);
        }
      

      【讨论】:

        【解决方案6】:

        你也可以告诉 Laravel 你想要一个 JSON 响应。将此标头添加到您的请求中:

        'Accept: application/json'
        

        Laravel 会返回一个 JSON 响应。

        【讨论】:

          【解决方案7】:

          我的解决方案是制作我自己的 FormRequest 类,我将它放在根 API 命名空间命名空间 App\Http\Requests\Api 中。

          希望这对某人有所帮助

          https://jamesmills.co.uk/2019/06/05/how-to-return-json-from-laravel-form-request-validation-errors/

          【讨论】:

          • 感谢您的解决方案 - 它帮助我在 API 响应中发现验证错误。是的,你是对的 - FormRequests 是现在的方式,而不是内联验证。
          【解决方案8】:

          实际上我使用了@Soura 解决方案,但做了一点改动。您还需要导入 Validator 包。

          $validator = \Validator::make($request->all(), [ 
                'ride_id' => 'required',
                'rider_rating' => 'required',
            ]);
          
            if ($validator->fails()) {
              return response()->json($validator->errors(), 400);
            }
          

          【讨论】:

            【解决方案9】:

            如果您使用的是请求类。

            你可以使用failedValidation来处理你的失败

                /**
                 * Returns validations errors.
                 *
                 * @param Validator $validator
                 * @throws  HttpResponseException
                 */
                protected function failedValidation(Validator $validator)
                {
                    if ($this->wantsJson() || $this->ajax()) {
                        throw new HttpResponseException(response()->json($validator->errors(), 422));
                    }
                    parent::failedValidation($validator);
                }
            

            【讨论】:

              猜你喜欢
              • 2015-08-16
              • 2016-09-20
              • 1970-01-01
              • 2018-06-13
              • 1970-01-01
              • 2022-10-18
              • 1970-01-01
              • 1970-01-01
              • 2017-02-20
              相关资源
              最近更新 更多