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

Php 在Lumen 7中进行验证时,如何返回自定义JSON数组名称和内部元素?,php,json,laravel,lumen,Php,Json,Laravel,Lumen,我试图返回Lumen 7.2.1中验证错误消息的JSON 在邮递员给我回信的那一刻: { "last_name": [ "Pole zawiera niepoprawne znaki" ], "email": [ "Email jest już zajęty" ] } 我想退回这样的东西: { errors: [ "l

我试图返回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'…],但结果是一样的。

首先,控制器中的在线验证根本不是最好的方法,使用
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
中完成,这将使所有异常正确转换,从多个控制器中删除笨拙的逻辑

public function render($request, \Throwable $exception)
{
    if ($request->expectsJson() && $exception instanceof ValidationException) {
        return response()->json([
            'errors' => $exception->errors(),
        ], Response::HTTP_UNPROCESSABLE_ENTITY);
    }

    ...
}
使用
$request->expectsJson()
检查API是否请求或避免此转换,否则只需转换结果,我们就可以使您的控制器方法尽可能简单

public function update(UpdateUserRequest $request, $id)
{
   $user = User::findorFail($id);

    $user->update($request->all());

    return response()->json(['data' => $user], 200);
}

捕获所有异常没有任何作用,让
异常/Handler.php
也处理它。对于奖励积分,用户也可以使用模型绑定。但我认为这是一个足够大的转变。

检查这个:让我知道它是否有效:)谢谢,但我将使用下面列出的方法。只要意识到这是一个带有拉威尔标签的流明问题,你必须经历一些困难才能使FormRequest工作,应该是可能的,或者最坏的情况下,像往常一样处理您的请求,并抛出新的ValidationException或类似内容。使其正常工作,感谢您的帮助和大量新信息!