The*_*mie 3 php validation laravel laravel-5.5
在Laravel 5.4中,我们创建了一个继承所有验证请求的类,因为我们需要自定义响应。
class APIRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return false;
}
/**
* Response on failure
*
* @param array $errors
* @return Response
*/
public function response(array $errors) {
$response = new ResponseObject();
$response->code = ResponseObject::BAD_REQUEST;
$response->status = ResponseObject::FAILED;
foreach ($errors as $item) {
array_push($response->messages, $item);
}
return Response::json($response);
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
//
];
}
}
Run Code Online (Sandbox Code Playgroud)
可以扩展此内容的示例请求如下所示
class ResultsGetTermsRequest extends APIRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'school_id' => 'required|integer',
'student_id' => 'required|integer',
];
}
}
Run Code Online (Sandbox Code Playgroud)
然后我们对失败的样本响应是
{
"status": "FAILED",
"code": "400",
"messages": [
[
"The school id field is required."
],
[
"The student id field is required."
]
],
"result": []
}
Run Code Online (Sandbox Code Playgroud)
但是,这对于Laravel 5.5不再有效。我注意到他们用替换了响应方法failedValidation。但是,如果请求未通过验证,则不会返回任何响应。如果取消注释print_r,则返回某些内容。似乎永远不会执行的唯一一行是return语句。我想念什么?
public function failedValidation(Validator $validator) {
$errors = (new ValidationException($validator))->errors();
$response = new ResponseObject();
$response->code = ResponseObject::BAD_REQUEST;
$response->status = ResponseObject::FAILED;
foreach ($errors as $item) {
array_push($response->messages, $item);
}
//print_r($response);
return Response::json($response);
}
Run Code Online (Sandbox Code Playgroud)
如果你想从 FormRequest 类中做到这一点,可能是这样的:
protected function buildResponse($validator)
{
return response->json([
'code' => ResponseObject::BAD_REQUEST,
'status' => ResponseObject::FAILED,
'messages' => $validator->errors()->all(),
]);
}
protected function failedValidation(Validator $validator)
{
throw (new ValidationException($validator, $this->buildResponse($validator));
}
Run Code Online (Sandbox Code Playgroud)
这会将您正在构建的响应添加到验证异常中。当异常处理程序尝试呈现它时,它将检查是否response已设置,如果已设置,它将使用您传递的响应,而不是尝试将 ValidationException 转换为响应本身。
如果您希望“所有”验证异常最终以这种格式呈现,我可能只是在异常处理程序级别执行此操作,因为异常处理程序已经能够将这些异常转换为 Json,因此您可以更改格式处理程序本身,基本上根本不必对默认 FormRequest 进行任何调整。
我想按照laravel 升级指南,我们应该返回HttpResponseException
protected function failedValidation(Validator $validator)
{
$errors = $validator->errors();
$response = new ResponseObject();
$response->code = ResponseObject::BAD_REQUEST;
$response->status = ResponseObject::FAILED;
foreach ($errors as $item) {
array_push($response->messages, $item);
}
throw new HttpResponseException(response()->json($response));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3316 次 |
| 最近记录: |