将Laravel验证错误作为JSON响应返回

3
在我的Laravel的RegisterController中,我有困难将错误返回给我的前端。我们的应用程序是作为REST API构建的,因此通过向注册路由发出AJAX请求来注册新用户。如果验证通过,则一切正常,但如果验证失败,则不会显示任何错误信息。它只会重定向到Laravel主页。我们没有使用Blade用于前端,因此无法从Blade获取默认的验证错误。前端是一个ReactJS客户端,通过AJAX调用与后端通信。
如何获得JSON,其中包含未通过验证的字段,并将其返回给我的前端?
protected function validator(array $data)
{
    return Validator::make($data, [
        'first_name' => 'required|string|max:255',
        'last_name'  => 'required|string|max:255',
        'email'      => 'required|string|email|max:255|unique:users',
        'password'   => 'required|string|min:6|confirmed',
        'birth_year' => 'required|integer|min:4',
        'lat'        => 'required|numeric',
        'lon'        => 'required|numeric',
    ]);        
}
3个回答

5

您可以通过以JSON响应的形式返回错误来解决此问题。

$validator = Validator::make($data, [
    'first_name' => 'required|string|max:255',
    'last_name'  => 'required|string|max:255',
    'email'      => 'required|string|email|max:255|unique:users',
    'password'   => 'required|string|min:6|confirmed',
    'birth_year' => 'required|integer|min:4',
    'lat'        => 'required|numeric',
    'lon'        => 'required|numeric',
]);        

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

1

您的代码很好,因为Laravel会自动返回一个带有422 HTTP状态的JSON响应,所以您可以捕获错误。

因此,在您的ajax中使用error函数,如果验证器失败,ajax将自动执行您在ajax的错误中编写的代码。

有关如何正确处理ajax错误的更多信息,请查看此问题。 使用React.js和AJAX在Laravel 5中显示验证错误


0
我通过禁用RegisterController中的“guest”中间件来解决了这个问题。我不确定这是否是一个可靠的解决方案,但目前它可以工作。

如果您不禁用“guest”中间件验证程序,则验证程序不会自动返回带有422的HTTP响应,这应该由您的ajax捕获?如果解决方案是禁用与验证无关的中间件,那将非常奇怪。 - Pol Lluis
确实很奇怪,但我认为这与中间件的某些重定向有关。 - kajdehoop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接