【问题标题】:return first error in customized formatted in laravel 5.5 form requests在 laravel 5.5 表单请求中以自定义格式返回第一个错误
【发布时间】:2019-03-28 21:21:18
【问题描述】:

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


    【解决方案1】:

    此功能在 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)
            );
        }
    }
    

    【讨论】:

      【解决方案2】:
      protected function formatErrors (Validator $validator)
      {
          $result = ['success' => false, 'msg' => $validator->errors()];
          return $result;
      }
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2021-04-10
          • 2021-04-30
          • 2020-01-17
          • 2020-07-21
          • 1970-01-01
          • 2021-12-13
          • 2019-05-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多