格式化FormRequest验证错误响应

时间:2017-02-07 21:58:07

标签: php validation laravel-5.3

参考此stack question and answer我尝试将错误验证的响应格式化为更简化的格式...因此在自定义App \ Http \ Requests \ CustomRequest中我有

public function rules()

{
    return [
        'amt' => 'required|numeric|min:1000',
        'year' => 'required|numeric|min:' . date_format(new \DateTime, 'Y'),
        'user_id' => 'required',
        'ratio' => 'required'
    ];
}

public function response(array $errors)
   {
       if ($this->expectsJson()) {
          return response()->json(['messsage'=>'Cannot Validate','errors'=> $errors]);
       }

       return $this->redirector->to($this->getRedirectUrl())
                                       ->withInput($this->except($this->dontFlash))
                                       ->withErrors($errors, $this->errorBag);
   }

/**
    * Format the errors from the given Validator instance.
    *
    * @param  \Illuminate\Contracts\Validation\Validator  $validator
    * @return array
    */
   protected function formatErrors(Validator $validator)
   {
       return [];
   }

在我的控制器中我有

/**
     * Store a newly created resource in storage.
     *
     * @param \Illuminate\Http\Request $request
     *
     * @return Response Header 201
     */
    public function store(CustomFormRequest $request)
    {

        $requestData = $request->all();
        Budget::create($requestData);

        return response([], 201);
    }

根据laravel文档,我只需要" typehint"请求。但是我的回答总是如此。

  

{" ID":" validation_failed""消息":"验证   失败""元":{"错误" {" AMT":[{"规则":&#34 ; min.numeric""消息":"该   amt必须至少为1000.","参数":[" 1000"]}]}}}

如果我改变响应格式,那是没有意义的。我需要的是

  

{" ID":" validation_failed""消息":"验证   失败""错误":[{" AMT" {"消息":"该   amt必须至少为1000."}}]}

我不确定此时应该做些什么。还有什么?

2 个答案:

答案 0 :(得分:1)

旁道通信(IRC)显示肯德尔正在使用lanin/laravel-api-exceptions。这个包有一个自定义异常处理程序,它将Laravel的内置ValidationException更改为自定义异常类和自定义输出处理。提示输出不是由Laravel生成的,可以是json输出中的meta键,Laravel不会生成它。

该问题提到了FormRequest的response(array $errors)formatErrors(Validator $validator)方法,但这些方法不会使用这些方法。

可以通过覆盖自定义异常处理程序的renderForApi方法来修改验证失败的json结果,检查ValidationFailedApiException,并为这些返回自定义响应。

答案 1 :(得分:-1)

要发出自定义错误消息,我想您正在寻找messages方法。在该方法上,只需返回一个数组。

示例:['fieldName.rule' => 'Custom message']

请参阅:https://laravel.com/api/5.3/Illuminate/Foundation/Http/FormRequest.html#method_messages

奖励:如果您想为字段名称命名,也只需制作attributes方法。

请参阅:https://laravel.com/api/5.3/Illuminate/Foundation/Http/FormRequest.html#method_attributes