问题描述
我正在尝试在Lumen 7.2.1中返回验证错误消息的JSON
此刻,邮递员还给我这个消息:
{
"last_name": [
"Pole zawiera niepoprawne znaki"
],"email": [
"Email jest już zajęty"
]
}
我想返回这样的内容:
{
errors: [
"last_name": [
"Pole zawiera niepoprawne znaki"
],"email": [
"Email jest już zajęty"
]
]
}
这是我在控制器中的更新方法:
/**
* Update user
*
* @param Request $request
* @param $id
* @return JsonResponse
* @throws ValidationException
*/
public function update(Request $request,$id)
{
//validate incoming request
$this->validate($request,[
'name' => 'required|string|alpha','last_name' => 'required|string|alpha','email' => 'required|email|unique:users',],[
'name.required' => 'Pole Imię jest wymagane','name.alpha' => 'Pole zawiera niepoprawne znaki','last_name.required' => 'Pole Nazwisko jest wymagane','last_name.alpha' => 'Pole zawiera niepoprawne znaki','email.required' => 'Pole Email jest wymagane','email.email' => 'Niepoprawny email','email.unique' => 'Email jest już zajęty',]);
try {
$user = User::findorFail($id);
$user->update($request->all());
return response()->json(['data' => $user],200);
} catch (\Exception $e) {
return response()->json(['message' => 'User Update Failed!'],409);
}
}
我尝试添加$ errors = ['name.required'...,],但结果相同。
解决方法
首先,在控制器中进行线内验证并不是最好的方法,使用80 100 105
更清洁,您可以免费处理错误。我曾经对自己说过谎,说在线方法更快,不,不是。
FormRequest
应该在class UpdateUserRequest extends FormRequest {
public function rules() {
return [
'name' => 'required|string|alpha','last_name' => 'required|string|alpha','email' => 'required|email|unique:users',];
}
public function messages() {
return [
'name.required' => 'Pole Imię jest wymagane','name.alpha' => 'Pole zawiera niepoprawne znaki','last_name.required' => 'Pole Nazwisko jest wymagane','last_name.alpha' => 'Pole zawiera niepoprawne znaki','email.required' => 'Pole Email jest wymagane','email.email' => 'Niepoprawny email','email.unique' => 'Email jest już zajęty',];
}
}
中完成验证异常的转换,这将使所有异常正确转换,从而消除了多个控制器的笨拙逻辑。
Exceptions/Handler.php
检查API是否请求或避免使用public function render($request,\Throwable $exception)
{
if ($request->expectsJson() && $exception instanceof ValidationException) {
return response()->json([
'errors' => $exception->errors(),],Response::HTTP_UNPROCESSABLE_ENTITY);
}
...
}
进行此转换,否则只需转换结果即可,我们可以使您的控制器方法变得如此简单。
$request->expectsJson()
捕获所有异常不会执行任何操作,让public function update(UpdateUserRequest $request,$id)
{
$user = User::findorFail($id);
$user->update($request->all());
return response()->json(['data' => $user],200);
}
也可以处理。对于奖励积分,也请为用户使用模型绑定。但是我认为这是一个足够大的转变。