在laravel 5.5之前,我使用了这样的表单请求,并使用了自定义格式:
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Contracts\Validation\Validator;
class StoreProductRequest extends FormRequest
{
public function authorize ()
{
return true;
}
public function rules ()
{
return [
'title' => 'required',
'desc' => 'required',
];
}
public function response (array $errors)
{
return response()->json($errors, 200);
}
protected function formatErrors (Validator $validator)
{
$result = ['success' => false, 'msg' => $validator->errors()->first()];
return $result;
}
}
表示发生错误时,只有第一个错误以json格式返回,如下所示:
{
"success" : "false",
"msg" : "title field is required "
}
但似乎在laravel 5.5中以这种方式无法格式化这样的错误。
现在我想以json格式返回与上面提到的格式完全相同的错误,但我不知道怎么可以
Laravel 5.5中更改了此功能。 From the upgrade guide“关于表格请求的说明”:
如果您要自定义单个表单请求的响应格式,您现在应该覆盖该表单请求的
failedValidation
方法,并抛出包含自定义响应的HttpResponseException实例
您更新的表单请求可能如下所示(伪代码,未经过测试):
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;
class StoreProductRequest extends FormRequest
{
public function authorize()
{
return true;
}
public function rules()
{
return [
'title' => 'required',
'desc' => 'required',
];
}
public function failedValidation(Validator $validator)
{
throw new HttpResponseException(
response()->json(['success' => false, 'msg' => $validator->errors()->first()], 400)
);
}
}
protected function formatErrors (Validator $validator)
{
$result = ['success' => false, 'msg' => $validator->errors()];
return $result;
}
扩大@Aken Roberts的答案。由于这是表单的错误响应,我使用错误键(输入字段名称)来显示输入旁边的错误。您可以从keys
方法获取第一个错误键。使用Laravel 5.7,这可以按预期工作:
public function failedValidation(Validator $validator)
{
throw new HttpResponseException(
response()->json([
'success' => false,
'error' => (object) [
$validator->errors()->keys()[0] => $validator->errors()->first()
]
], 400)
);
}