【问题标题】:Laravel validation with custom json respons使用自定义 json 响应进行 Laravel 验证
【发布时间】: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', ] );

标签: json laravel validation


【解决方案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 中添加了代码,但没有任何效果
    猜你喜欢
    • 2018-02-02
    • 2018-06-17
    • 1970-01-01
    • 2019-01-29
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    相关资源
    最近更新 更多