使用自定义 json 响应进行 Laravel 验证

Wes*_*ijk 9 validation json laravel

快问。是否可以更改 laravel 的 JSON 验证响应?这是我在 Laravel 中构建的自定义 API。

验证过程

$validation = $this->validate( 
    $request, [
        'user_id' => 'required', 
    ]);
Run Code Online (Sandbox Code Playgroud)

响应在 json 中显示如下

{
  "message": "The given data was invalid.",
  "errors": {
    "user_id": [
      "The user id field is required."
    ],
  }
}
Run Code Online (Sandbox Code Playgroud)

最好它会变成这样。

{
    "common:" [
        "status": "invalid",
        "message": "Param xxxx is required",
    ],
}
Run Code Online (Sandbox Code Playgroud)

改变这种情况的最佳方法是什么?有可能吗?

谢谢。

Ars*_*nov 6

我正在寻找这个问题的答案,我想我找到了更好的方法。默认 Laravel 应用程序中有一个异常处理程序 - \App\Exceptions\Handler- 您可以重写该invalidJson方法:

<?php

namespace App\Exceptions;

use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Illuminate\Validation\ValidationException;

class Handler extends ExceptionHandler
{
    // ...

    protected function invalidJson($request, ValidationException $exception)
    {
        $errors = [];
        foreach ($exception->errors() as $field => $messages) {
            foreach ($messages as $message) {
                $errors[] = [
                    'code' => $field,
                    'message' => $message,
                ];
            }
        }
    
        return response()->json([
            'error' => $errors,
        ], $exception->status);
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

你可以做到这一点,并且它将在全球范围内得到体现。导航到下面的文件夹并使用 Controller.php app/Http/Controllers

use Illuminate\Http\Request;
Run Code Online (Sandbox Code Playgroud)

在 Controller.php 中编写以下方法并根据需要更改响应。

public function validate(
    Request $request,
    array $rules,
    array $messages = [],
    array $customAttributes = [])
{
    $validator = $this->getValidationFactory()
        ->make(
            $request->all(),
            $rules, $messages,
            $customAttributes
        );
    if ($validator->fails()) {
        $errors = (new \Illuminate\Validation\ValidationException($validator))->errors();
        throw new \Illuminate\Http\Exceptions\HttpResponseException(response()->json(
            [
                'status' => false,
                'message' => "Some fields are missing!",
                'error_code' => 1,
                'errors' => $errors
            ], \Illuminate\Http\JsonResponse::HTTP_UNPROCESSABLE_ENTITY));
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经用 Laravel 5.6 尝试过了,也许这对你有用。