在laravel 5.5表单请求中以自定义格式返回第一个错误

问题描述 投票:1回答:3

在laravel 5.5之前,我使用了这样的表单请求,并使用了自定义格式:

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Contracts\Validation\Validator;

class StoreProductRequest extends FormRequest
{
    public function authorize ()
    {
        return true;
    }

    public function rules ()
    {
        return [
            'title'      => 'required',
            'desc'       => 'required',
        ];
    }

    public function response (array $errors)
    {
        return response()->json($errors, 200);
    }

    protected function formatErrors (Validator $validator)
    {
        $result = ['success' => false, 'msg' => $validator->errors()->first()];
        return $result;
    }
}

表示发生错误时,只有第一个错误以json格式返回,如下所示:

{
   "success" : "false",
   "msg" : "title field is required "
}

但似乎在laravel 5.5中以这种方式无法格式化这样的错误。

现在我想以json格式返回与上面提到的格式完全相同的错误,但我不知道怎么可以

php laravel laravel-5.5
3个回答
3
投票

Laravel 5.5中更改了此功能。 From the upgrade guide“关于表格请求的说明”:

如果您要自定义单个表单请求的响应格式,您现在应该覆盖该表单请求的failedValidation方法,并抛出包含自定义响应的HttpResponseException实例

您更新的表单请求可能如下所示(伪代码,未经过测试):

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;

class StoreProductRequest extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            'title'      => 'required',
            'desc'       => 'required',
        ];
    }

    public function failedValidation(Validator $validator)
    {
        throw new HttpResponseException(
            response()->json(['success' => false, 'msg' => $validator->errors()->first()], 400)
        );
    }
}

1
投票
protected function formatErrors (Validator $validator)
{
    $result = ['success' => false, 'msg' => $validator->errors()];
    return $result;
}

0
投票

扩大@Aken Roberts的答案。由于这是表单的错误响应,我使用错误键(输入字段名称)来显示输入旁边的错误。您可以从keys方法获取第一个错误键。使用Laravel 5.7,这可以按预期工作:

public function failedValidation(Validator $validator)
{
    throw new HttpResponseException(
        response()->json([
            'success' => false,
            'error' => (object) [
                $validator->errors()->keys()[0] => $validator->errors()->first()
            ]
        ], 400)
    );
}
© www.soinside.com 2019 - 2024. All rights reserved.