关于php:验证请求时Laravel中的rest api

REST API in Laravel when validating the request

我目前正在尝试如何用Laravel构建一个RESTfulAPI,我目前正在创建一个新用户。这只是一个测试,在尝试使用Laravel中的验证来验证请求时,我得到了一些结果;结果如下:

enter image description here

我一直试图用以下代码创建一个新的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public function store()
{

    $validation = Validator::make(Request::all(),[
        'username' => 'required|unique:users, username',
        'password' => 'required',
    ]);

    if($validation->fails()){


    } else{
            $createUser = User::create([
                'username' => Request::get('username'),
                'password' => Hash::make(Request::get('password'))
            ]);
    }
}

但是我不知道如何返回验证中的错误。但是当我尝试使用validation->fails()做if时,它一直在给我图像中显示的HTML。有没有一种方法可以得到JSON格式的验证?


您可能应该返回错误(这是Illuminate\Support\MessageBag的一个实例)并对其进行编码。MessageBag实例允许您直接将其转换为JSON表示。

1
2
3
$errors = $validation->errors();

return $errors->toJson();

现在不要自吹自擂,但我最近为Laravel开发了一个RESTfulAPI包,它为您完成了所有这些工作,您需要做的只是抛出一个简单的异常。有关返回错误的信息,请参阅我的dingo/api包和wiki。基本上,不返回错误,而是抛出异常。

1
throw new Dingo\Api\Exception\StoreResourceFailedException('Could not create a new user.', $validation->errors());

它将由以下JSON表示。

1
2
3
4
5
6
{
   "message":"Could not create a new user.",
   "errors": {
       "username": ["The username is already in use."]
    }
}


这些代码将帮助您,为我工作。

1
2
3
4
5
6
7
8
$response = array('response' => '', 'success'=>false);
$validator = Validator::make($request->all(), $rules);
    if ($validator->fails()) {
        $response['response'] = $validator->messages();
    }else{
//process the request
}
return $response;


Laravel提供了一个现成的验证方法,您可以从控制器调用该方法。

如果检查laravel Controller抽象类,您会发现它使用了一个名为ValidatesRequests的特性。

1
2
3
4
   abstract class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
}

因此,只要控制器类扩展控制器,就可以使用方法$this->validate(Request $request, array $rules);

完整的方法声明是

1
2
3
4
5
6
7
8
public function validate(Request $request, array $rules, array $messages = [], array $customAttributes = [])
    {
        $validator = $this->getValidationFactory()->make($request->all(), $rules, $messages, $customAttributes);

        if ($validator->fails()) {
            $this->formatValidationErrors($validator);
        }
    }

如果$validator失败,该方法将根据请求类型引发错误,如果它是Ajax(在这种情况下,您应该在请求头(Accept application/json中包含),它将返回包含验证错误的JSON响应。


有关Laravel 5.5及更高版本,请参阅文档:Ajax请求和验证

tl;dr:验证失败时,返回带有422的JSON响应以及验证错误消息。在响应对象中查找这些验证错误花费了我一点时间,因此要查看错误消息(如果您使用的是AXIOS),请在浏览器控制台中尝试此操作:

1
2
3
4
5
6
axios.post('/api/your-route-here')
    .then(response => {
        console.log(response.data);
    }).catch(error => {
    console.log(error.response.data.errors)
});