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

Posted

技术标签:

【中文标题】使用自定义 json 响应进行 Laravel 验证【英文标题】:Laravel validation with custom json respons 【发布时间】:2019-07-09 04:57:04 【问题描述】:

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

验证过程

$validation = $this->validate( 
    $request, [
        'user_id' => 'required', 
    ]);

响应在 json 中显示如下


  "message": "The given data was invalid.",
  "errors": 
    "user_id": [
      "The user id field is required."
    ],
  

最好变成这样。


    "common:" [
        "status": "invalid",
        "message": "Param xxxx is required",
    ],

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

谢谢。

【问题讨论】:

为什么要改变这个?你可以在前端管理它。因为 laravel 一次返回一个元素的所有错误。在你的格式中它只是一个。 它用于返回json的自定义api函数。意思是获取某个json格式的模板 还根据当前的响应重新格式化您的预期结果,您到底需要什么?是的,请解释你为什么需要这个? 你能在返回 laravel 验证消息的地方显示你的代码吗? 现在 laravel 通过以下方式自己进行验证。 $validation = $this->validate( $request, [ 'user_id' => 'required', ] ); 【参考方案1】:

@Dev Ramesh 解决方案对于在控制器中放置内联仍然完全有效。

对于那些希望将此逻辑抽象为FormRequest 的人,FormRequest 有一个方便的覆盖方法,称为failedValidation。当这个被命中时,你可以抛出你自己的响应异常,像这样......

/**
 * When we fail validation, override our default error.
 *
 * @param ValidatorContract $validator
 */
protected function failedValidation(\Illuminate\Contracts\Validation\Validator $validator)

    $errors = $this->validator->errors();

    throw new \Illuminate\Http\Exceptions\HttpResponseException(
        response()->json([
            'errors' => $errors,
            'message' => 'The given data was invalid.',

            'testing' => 'Whatever custom data you want here...',
        ], 422)
    );

【讨论】:

【参考方案2】:

您可以这样做,它将在全球范围内反映出来。 导航到下面的文件夹并使用 Controller.php 应用程序/Http/控制器

use Illuminate\Http\Request;

在 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));
    

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

【讨论】:

谢谢,我正在找这个。如果我只想显示一个错误怎么办?这也可能吗?就像验证是 user_id 和用户名一样,但我他们都丢失了我只想显示 user_id 而不是用户名的错误。 @WesleySchravendijk,您可以对属性使用bail 规则。 我已经尝试过保释功能,但不知何故它在 laravel 5.7 中不起作用。例如; 'user_id' => '保释|需要', 使用 laravel 8 无法正常工作,我在 Controller.php 中添加了代码,但没有任何效果

以上是关于使用自定义 json 响应进行 Laravel 验证的主要内容,如果未能解决你的问题,请参考以下文章

如何自定义 laravel api 的 json 响应并在 vuex 中显示它们

自定义 laravel sanctum 未授权响应

WebSocketChannelException: HandshakeException - Flutter 应用程序与自定义服务器上的 Laravel Websockets 使用 Cpanel 验

从 Laravel 发送自定义 500 http 响应

用于 API 响应的 Laravel 自定义包装器

将 http json 响应转换为自定义类