验证请求时,Laravel中的REST API

Aoi*_*Aoi 31 php validation rest laravel-4

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

在此输入图像描述

我一直试图通过这段代码创建一个新的:

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')) 
            ]);
    }
}
Run Code Online (Sandbox Code Playgroud)

但后来我不知道如何在验证中返回错误.但是当我尝试使用if时,它会继续向我提供图像中显示的HTML validation->fails().有没有办法以JSON格式进行验证?

Jas*_*wis 25

您应该返回错误(这是一个实例Illuminate\Support\MessageBag)并对其进行编码.一个MessageBag实例,您可以直接转换成JSON表示.

$errors = $validation->errors();

return $errors->toJson();
Run Code Online (Sandbox Code Playgroud)

现在不要自己动手,但我最近为Laravel开发了一个RESTful API包,它可以为你完成所有这些,你需要做的就是抛出一个简单的异常.查看我的dingo/api包和返回错误的Wiki .基本上,不是返回错误,而是抛出异常.

throw new Dingo\Api\Exception\StoreResourceFailedException('Could not create a new user.', $validation->errors());
Run Code Online (Sandbox Code Playgroud)

它将由以下JSON表示.

{
    "message": "Could not create a new user.",
    "errors": {
        "username": ["The username is already in use."]
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 23

这些代码会帮助你,为我工作.

$response = array('response' => '', 'success'=>false);
$validator = Validator::make($request->all(), $rules);
    if ($validator->fails()) {
        $response['response'] = $validator->messages();
    }else{
//process the request
}
return $response;
Run Code Online (Sandbox Code Playgroud)

  • 这个答案值得更多赞扬。我已经尝试了所有解决方案,这个解决方案至少在 Laravel 5.2 中给了我正确的消息。 (2认同)

小智 5

Laravel提供了一种开箱即用的验证方法,您可以从Controller调用它。

如果您检查Laravel Controller抽象类,您会发现它使用称为ValidatesRequests

   abstract class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
}
Run Code Online (Sandbox Code Playgroud)

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

完整的方法声明是

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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

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


小智 5

有很多方法可以获取验证器响应,首先是同时获取所有验证错误,即您将得到如下所示的响应

 $validator = \Validator::make($request->all(), [
        'username' => 'required|unique:users, username',
        'password' => 'required',
       
    ]);

if ($validator->fails()) {
        $responseArr = CustomHelper::returnRespArr("");
        $responseArr['message'] = $validator->errors();;
        $responseArr['token'] = '';
        return response()->json($responseArr, Response::HTTP_BAD_REQUEST);
    }
Run Code Online (Sandbox Code Playgroud)

您将得到的回应是:

{
"status": false,
"data": [],
"message": {
    "username": [
        "The username field is required."
    ],
    "password": [
        "The password field is required."
    ]
},
"is_valid": 0,
"token": ""
}
Run Code Online (Sandbox Code Playgroud)

获取验证响应的第二种方法。在这种情况下,您一次会收到一个验证器错误。

    if ($validator->fails()) {
        $responseArr = CustomHelper::returnRespArr("");
        $responseArr['message'] = $validator->messages()->first();;
        $responseArr['token'] = '';
        return response()->json($responseArr,Response::HTTP_BAD_REQUEST);
    }
Run Code Online (Sandbox Code Playgroud)

您将得到的回应

{
"status": false,
"data": [],
"message": "The username field is required.",
"is_valid": 0,
"token": ""
}
Run Code Online (Sandbox Code Playgroud)