我正在开发一个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);
}
...
}
但是我找不到合适的方法来返回我想要的实际相关数据
答案 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);
}