Laravel验证错误自定义响应的格式

时间:2016-01-30 02:42:54

标签: validation laravel-5

我正在使用L5表格请求而我并不喜欢泰勒!好吧,我正在做一些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'];
}

仍然没有成功。

4 个答案:

答案 0 :(得分:8)

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

在虔诚的FormRequest使用failedValidation函数中抛出自定义exception

  // use Illuminate\Contracts\Validation\Validator; 
  // use App\Exceptions\MyValidationException; at top

  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中有效,但我不确定。

答案 1 :(得分:0)

在这里找到答案: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()方法)

答案 2 :(得分:0)

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

就我而言,我正在开发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;
    }

答案 3 :(得分:0)

这受this post和Shobi的回答启发。为什么不保留Shobi的回答中的transformErrors函数,而只修改render内部的Handler.php函数呢?一个例子如下:

/**
 * 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上测试