在Lumen 7中进行验证时,如何返回内部的自定义JSON数组名称和元素?

问题描述

我正在尝试在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); } 也可以处理。对于奖励积分,也请为用户使用模型绑定。但是我认为这是一个足够大的转变。