Laravel 5.2 - 使用 API 进行验证

Laravel 5.2 - Validation with API

我正在使用 Laravel 5.2 通过 REST JSON API.

进行验证

我有一个 UserController 扩展 Controller 并使用 ValidatesRequests 特性。

示例代码:

$this->validate($request, [
    'email'         => 'required|email',
    'password'      => 'required|min:4|max:72',
    'identifier'    => 'required|min:4|max:36',
    'role'          => 'required|integer|exists:role,id',
]);

这会引发异常,因此在我的 Exceptions/Handler.php 中我有以下代码:

public function render($request, Exception $e)
{
   return response()->json([
       'responseCode'  => 1,
       'responseTxt'   => $e->getMessage(),
   ], 400);
}

但是,验证时 responseTxt 总是:

Array
(
   [responseCode] => 1
   [responseTxt] => The given data failed to pass validation.
)

我过去使用过 Laravel 4.2 并记得验证错误提供了有关验证失败的更多详细信息。

我如何知道哪个字段未通过验证以及原因?

如果请求需要 JSON.

,则会抛出 ValidationException,它会呈现为单个通用消息

不使用 validate() 方法,而是手动调用验证器,例如:

$validator = Validator::make($request->all(), [
    'email'         => 'required|email',
    'password'      => 'required|min:4|max:72',
    'identifier'    => 'required|min:4|max:36',
    'role'          => 'required|integer|exists:role,id',
]);
if ($validator->fails()) {
    return new JsonResponse(['errors' => $validator->messages()], 422);
}

https://laravel.com/docs/5.2/validation#manually-creating-validators

顺便说一句,我建议使用 422 HTTP 状态代码而不是 400。400 通常意味着语法格式错误。导致验证错误的事情通常意味着语法正确,但数据无效。 422 表示“不可处理的实体” https://www.rfc-editor.org/rfc/rfc4918#section-11.2

在 Laravel 5.2 validate() 方法中抛出一个 Illuminate\Validation\ValidationException,因此如果您想要获得响应,请使用 getResponse() 而不是 getMessage()。

例如,处理此异常的一种简单方法可能是执行以下操作:

try{
   $this->validate($request, [
       'email'         => 'required|email',
       'password'      => 'required|min:4|max:72',
       'identifier'    => 'required|min:4|max:36',
       'role'          => 'required|integer|exists:role,id'
   ]);
}catch( \Illuminate\Validation\ValidationException $e ){
    return $e->getResponse();
}