Php 验证请求时Laravel中的REST API

Php 验证请求时Laravel中的REST API,php,validation,rest,laravel-4,Php,Validation,Rest,Laravel 4,我目前正在尝试如何用Laravel构建RESTful API,我目前正在创建一个新用户。这只是一个测试,在尝试使用Laravel中的验证来验证请求时,我得到了一些结果;结果如下: 我一直在尝试通过以下代码创建一个新的: public function store() { $validation = Validator::make(Request::all(),[ 'username' => 'required|unique:users, username',

我目前正在尝试如何用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')) 
            ]);
    }
}

但是我不知道如何在验证中返回错误。但是当我尝试使用
验证->失败()
执行if时,它一直在给我如图所示的HTML。有没有办法获得JSON格式的验证?

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

$errors = $validation->errors();

return $errors->toJson();
现在不要吹嘘我自己,但我最近为Laravel开发了一个RESTful API包,它可以为您完成所有这些,您需要做的就是抛出一个简单的异常。请参阅上的“我的软件包”和Wiki。基本上,不是返回错误,而是抛出异常

throw new Dingo\Api\Exception\StoreResourceFailedException('Could not create a new user.', $validation->errors());
它将由以下JSON表示

{
    "message": "Could not create a new user.",
    "errors": {
        "username": ["The username is already in use."]
    }
}

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

如果您检查Laravel
Controller
抽象类,您会发现它使用了一个名为
validateRequests

   abstract class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
}
因此,您可以使用方法
$this->validate(请求$Request,数组$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);
        }
    }

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

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

$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 5.5及以上版本,请参见文档:

TL;DR:验证失败时,将返回一个带有422的json响应以及验证错误消息。我花了一些时间在响应对象中找到这些验证错误,因此如果您使用的是axios,请在浏览器控制台中尝试以下操作:

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

获得验证程序响应的方法有很多,首先是同时获得一个all验证错误,也就是说,您将得到一个如下所示的响应

 $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);
    }
您将得到的答复是:

{
"status": false,
"data": [],
"message": {
    "username": [
        "The username field is required."
    ],
    "password": [
        "The password field is required."
    ]
},
"is_valid": 0,
"token": ""
}
获取验证响应的第二种方法。在这种情况下,您每次将得到一个验证程序错误

    if ($validator->fails()) {
        $responseArr = CustomHelper::returnRespArr("");
        $responseArr['message'] = $validator->messages()->first();;
        $responseArr['token'] = '';
        return response()->json($responseArr,Response::HTTP_BAD_REQUEST);
    }
你会得到什么样的回应

{
"status": false,
"data": [],
"message": "The username field is required.",
"is_valid": 0,
"token": ""
}

在我完成这项工作后,我将尝试您的软件包。问题是它返回if($validation->fails()){在我的终端中输入html,这样你将返回一些html,然后它将无法读取下一行代码。这是我关于它发生了什么的理论。继续。我必须指定内容类型。我在这里找到了答案,你应该鸣笛。野狗现在是一个非常流行的软件包。因此,感谢你制作它!这个答案值得更多的赞扬。i'v我尝试了所有的解决方案,这一个至少在Laravel 5.2中给了我正确的信息。Laravel为XMLHttpRequest做了开箱即用的——对于AJAX,我认为它也应该为API请求做这件事,因为Laravel是面向API的。我想知道是否有可能找到一种方法来进行API调用XMLHttpRequest。这会太奇怪吗?+1这应该是accepted应答;重用控制器代码并自动格式化错误AJAX请求。