【问题标题】:How to return custom response when validation has fails using laravel form requests使用laravel表单请求验证失败时如何返回自定义响应
【发布时间】:2019-10-19 16:04:39
【问题描述】:

当我们在控制器中使用Laravel Form Requests 并且验证失败时,表单请求将使用errors 变量重定向回来。

当数据无效时如何禁用redirection并返回自定义错误响应?

我将使用表单请求GET|POST|PUT请求类型。

我尝试了 Validator 类来解决我的问题,但我必须使用表单请求。

$validator = \Validator::make($request->all(), [
    'type' => "required|in:" . implode(',', $postTypes)
]);

if ($validator->fails()) {
    return response()->json(['errors' => $validator->errors()]);
}

【问题讨论】:

标签: laravel validation


【解决方案1】:

这是相同的,但写法不同:

protected function failedValidation(Validator $validator)
{
    $errors = (new ValidationException($validator))->errors();

    throw new HttpResponseException(
        response()->json([
            'message' => "",
            'errors' => $errors
        ], JsonResponse::HTTP_UNPROCESSABLE_ENTITY)
    );
}

【讨论】:

    【解决方案2】:

    创建自定义 FormRequest 类是可行的方法。

    namespace App\Http\Requests;
    
    use Illuminate\Contracts\Validation\Validator;
    use Illuminate\Validation\ValidationException;
    use Illuminate\Http\Exceptions\HttpResponseException;
    
    class FormRequest extends \Illuminate\Foundation\Http\FormRequest
    {
        protected function failedValidation(Validator $validator)
        {
            if ($this->expectsJson()) {
                $errors = (new ValidationException($validator))->errors();
                throw new HttpResponseException(
                    response()->json(['data' => $errors], 422)
                );
            }
    
            parent::failedValidation($validator);
        }
    }
    

    类位于app/Http/Requests 目录中。在 Laravel 6.x 中测试和工作。

    【讨论】:

    • 我终于找到了你的答案,正是我需要的。
    • 感谢您的回答。有没有办法为所有表单请求全局执行此操作?还是在中间件中?
    • @Nebster 你可以在你的其他表单请求类中扩展这个类。
    【解决方案3】:
    *use this on function*
    dont forget to take on top  // use App\Http\Requests\SomeRequest;
    
    $validatedData = $request->validated();
    \App\Validator::create($validatedData);
    
    *create request php artisan make:request SomeRequest*
    ex.
    use Illuminate\Contracts\Validation\Validator;
    
    class SomeRequest extends FormRequest
    {
       public function rules()
        {
            return [
                'health_id'      => 'required',
                'health'         => 'required',
            ];
        }
    
    }
    

    【讨论】:

      【解决方案4】:

      基类FormRequest 有方法failedValidation。尝试在您的 FormRequest 后代中覆盖它

      use Illuminate\Contracts\Validation\Validator;
      
      class SomeRequest extends FormRequest
      {
          ...
      
          public function failedValidation(Validator $validator)
          {
              // do your stuff
          }
      }
      

      【讨论】:

      • 错误信息:Declaration of App\Http\Requests\PostCreate::failedValidation(App\Http\Requests\Validator $validator) should be compatible with Illuminate\Foundation\Http\FormRequest::failedValidation(Illuminate\Contracts\Validation\Validator $validator)
      • 看来你没有添加use of Validator
      • 我已经 use Validator 也很累 \Validator 但没有工作
      • 你应该使用混凝土use Illuminate\Contracts\Validation\Validator;
      • 我想在 API 路由中使用 Form Requests 验证数据并返回 errors 而不是重定向。 @Roman Bobrik
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-24
      • 1970-01-01
      • 2021-04-21
      • 2015-05-01
      • 2021-04-10
      相关资源
      最近更新 更多