Laravel总是在json中返回验证错误的错误包

时间:2017-06-26 17:26:04

标签: laravel laravel-5 laravel-5.4

我正在开发一个api,它也应该提供有关验证问题的消息。

当“硬编码”验证器时,我正在做这样的事情

if ($validator->fails()) {
    return response()->json($validator->errors(), 400);
}

这很好用 - 但是我想要一个“通用”解决方案基本上捕获所有ValidationExceptions并执行与上面相同的操作。

我已经尝试过使用Handler.php

的渲染功能
public function render($request, Exception $exception)
{
    $message = $exception->getMessage();

    if (is_object($message)) {
        $message = $message->toArray();
    }

    if ($exception instanceof ValidationException) {
        return response()->json($message, 400);
    }

    ...
}

但是我找不到合适的方法来返回我想要的实际相关数据

2 个答案:

答案 0 :(得分:0)

这有点愚蠢 - 实际上laravel已经提供了我想要的东西。 Handler扩展了ExceptionHandler,它执行:

public function render($request, Exception $e)
{
    $e = $this->prepareException($e);

    if ($e instanceof HttpResponseException) {
        return $e->getResponse();
    } elseif ($e instanceof AuthenticationException) {
        return $this->unauthenticated($request, $e);
    } elseif ($e instanceof ValidationException) {
        return $this->convertValidationExceptionToResponse($e, $request);
    }

    return $this->prepareResponse($request, $e);
}

和convertValidationExceptionToResponse:

    if ($e->response) {
        return $e->response;
    }

    $errors = $e->validator->errors()->getMessages();

    if ($request->expectsJson()) {
        return response()->json($errors, 422);
    }

    return redirect()->back()->withInput(
        $request->input()
    )->withErrors($errors);

正是我想要的

答案 1 :(得分:-1)

public function render($request, Exception $exception)
{
 if ($request->wantsJson() && (str_contains('api/v1/register', $request->path())) || (str_contains('api/v1/login', $request->path())) ) {
$errors = null ;
if($exception->validator){
$errors = $exception->validator->errors();
}
return response()->json([
'status' => 422,'success'=> false,'message'=>''. $exception->getMessage() ,'error'=> "" . $errors
            ], 422);
}
return parent::render($request, $exception);
}