验证请求时,Laravel中的REST API

时间:2014-04-18 21:25:36

标签: php validation rest laravel-4

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

enter image description here

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

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格式进行验证?

5 个答案:

答案 0 :(得分:25)

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

$errors = $validation->errors();

return $errors->toJson();

现在不要自言自语,但我最近为Laravel开发了一个RESTful API包,它为你完成所有这些,你需要做的就是抛出一个简单的例外。在dingo/api上查看我的returning errors包和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."]
    }
}

答案 1 :(得分:21)

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

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

答案 2 :(得分:3)

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

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

   abstract class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
}

因此,只要控制器类扩展了控制器

,就可以使用方法$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);
        }
    }

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

答案 3 :(得分:1)

对于laravel 5.5及更高版本,请参阅文档:AJAX Requests & Validation

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)
});

答案 4 :(得分:0)

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

Sub MergeExcelFiles()
    Dim fnameList, fnameCurFile As Variant
    Dim countFiles, countSheets As Integer
    Dim wksCurSheet As Worksheet
    Dim wbkCurBook, wbkSrcBook As Workbook

    fnameList = Application.GetOpenFilename(FileFilter:="Microsoft Excel Workbooks (*.xls;*.xlsx;*.xlsm),*.xls;*.xlsx;*.xlsm", Title:="Choose Excel files to merge", MultiSelect:=True)

    If (vbBoolean <> VarType(fnameList)) Then

        If (UBound(fnameList) > 0) Then
            countFiles = 0
            countSheets = 0

            Application.ScreenUpdating = False
            Application.Calculation = xlCalculationManual

            Set wbkCurBook = ActiveWorkbook

            For Each fnameCurFile In fnameList
                countFiles = countFiles + 1

                Set wbkSrcBook = Workbooks.Open(filename:=fnameCurFile)

                For Each wksCurSheet In wbkSrcBook.Sheets
                    countSheets = countSheets + 1
                    wksCurSheet.Copy After:=wbkCurBook.Sheets(wbkCurBook.Sheets.Count)
                Next

                wbkSrcBook.Close SaveChanges:=False

            Next

            Application.ScreenUpdating = True
            Application.Calculation = xlCalculationAutomatic

            MsgBox "Procesed " & countFiles & " files" & vbCrLf & "Merged " & countSheets & " worksheets", Title:="Merge Excel files"
        End If

    Else
        MsgBox "No files selected", Title:="Merge Excel files"
    End If
End Sub

您将获得的答复是:

 $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);
    }