在Laravel 5.5表格请求中返回定制格式化的第一个错误



laravel 5.5 我使用这样的表单请求与自定义格式:

namespace AppHttpRequests;
use IlluminateFoundationHttpFormRequest;
use IlluminateContractsValidationValidator;
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格式提到上面提到的完全相同的错误,但我不知道

如何

在Laravel 5.5中更改了此功能。从升级指南"表单请求上的注释":

如果您正在自定义单个表单请求的响应格式,则现在应该覆盖该表单请求的failedValidation方法,然后抛出包含您自定义响应的httpresponseexception实例

您更新的表单请求可能看起来像这样(伪代码,未测试(:

<?php
namespace AppHttpRequests;
use IlluminateFoundationHttpFormRequest;
use IlluminateContractsValidationValidator;
use IlluminateHttpExceptionsHttpResponseException;
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)
        );
    }
}
protected function formatErrors (Validator $validator)
{
    $result = ['success' => false, 'msg' => $validator->errors()];
    return $result;
}

扩展在@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)
    );
}

最新更新