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

Posted

技术标签:

【中文标题】在 Lumen 7 中验证时如何返回自定义 JSON 数组名称和内部元素?【英文标题】:How to return custom JSON array name and elements inside when validating in Lumen 7? 【发布时间】:2020-12-11 20:21:06 【问题描述】:

我正在尝试在 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'...,] 但结果是一样的。

【问题讨论】:

检查这个:***.com/questions/46857342/… 让我知道它是否有效 :) 谢谢,但我会使用下面列出的方法 【参考方案1】:

首先,在控制器中进行在线验证,这根本不是最好的方法,使用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);

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

【讨论】:

刚刚意识到这是一个用 Laravel 标记的流明问题,你必须经历一些障碍才能使 FormRequest 工作,应该是可能的,或者在最坏的情况下,像往常一样处理你的请求并抛出新的 ValidationException或类似的。 成功了,感谢您的帮助和很多新信息!

以上是关于在 Lumen 7 中验证时如何返回自定义 JSON 数组名称和内部元素?的主要内容,如果未能解决你的问题,请参考以下文章

Auth 尝试方法在 Laravel/Lumen + JWT + 用户自定义模型中如何工作

流明自定义验证

Lumen 提供验证错误的代码

控制台生命周期中的 Lumen 自定义中间件

如何在 Lumen 中使用身份验证进行用户登录?为啥我在启动时看到“未经授权”?

Lumen 如何验证用户和客户端