【问题标题】:Laravel 5 : on success Validation Request functionLaravel 5:成功验证请求功能
【发布时间】:2015-09-08 12:05:13
【问题描述】:

在 laravel 5 中,我们现在可以像这样使用 Request 类进行输入验证:

    public function store(StoreItemRequest $request)
    {
        $item = Item::create($request->all());
        return 'success';
    }

当验证失败时,由于Request 类中的response 函数,我可以得到错误:

    public function response(array $errors) {
       return response()->json(['errors' => $errors]);
    }

但是如果验证成功呢?有没有像这样自动触发的功能:

    public function ????(){
         if($request->ajax())
           return response()->json(['success' => true]);
    }

注意:要求如果请求是ajax,则函数store的内容不会被执行(就像验证失败时它不会被执行一样)。

【问题讨论】:

  • 你看到我的回答了吗?

标签: laravel-5 laravel-validation


【解决方案1】:

是的,我在ValidateWhenResolvedTrait 中找到了validate 方法,您可以在表单请求类中覆盖该方法;

public function validate(){

     $instance = $this->getValidatorInstance();

      if($this->passesAuthorization()){
             $this->failedAuthorization();
       }elseif(!$instance->passes()){
              $this->failedValidation($instance);
      }elseif( $instance->passes()){

         if($this->ajax())
            throw new HttpResponseException(response()->json(['success' => true]));

      }

}

【讨论】:

  • 是的,这可以工作,我已经尝试过这个功能。但是,return response()->json 不会停止 store 函数的执行。代码确实通过了 $instance->passes() 部分,但它继续运行。 (另外,您需要将 $this->request->ajax() 替换为 $this->ajax() )
  • 我编辑了您的答案并使用我的解决方案修复了响应部分,以实际终止代码的执行并发送响应。在我的编辑将经过同行评审后,如果您对解决方案满意,我会接受答案。谢谢
  • 没关系。所以你的问题现在解决了吗?我只是自己批准的。但是我注意到你抛出了一个异常:抛出新的 HttpResponseException,if($request->ajax()) return response()->json(['success' => true]); 没有工作怎么样?
  • 我的问题已通过 HttpResponseException 解决。使用return->response(),代码不会停止执行。抛出异常是个坏主意吗?
  • 好的,我明白了;但是 HttpResponseException 正在向您的浏览器发送错误信息,可能是错误 404 或 403 左右?你,我相信这会奏效; if($request->ajax()) return response()->json(['success' => true]); die();
【解决方案2】:

目前没有这样的方法。您可以在您的请求中使用一些“hacks”(例如覆盖 validate 方法)来执行此操作,但我不建议这样做。

Request 的想法是将验证/授权移出控制器。如果您将成功响应移至Request,则我们的情况与以前相同(嗯,名称已更改)。

我建议让控制器也处理 ajax:

public function store(StoreItemRequest $request)
{
    $item = Item::create($request->all());
    if($request->ajax())
       return response()->json(['success' => true]);
    return 'success';
}

您是否有理由尝试在请求中实现这一目标?

【讨论】:

  • 就像您可以在表单请求中覆盖 response(array $errors) 的方式一样,覆盖 validate() 方法不是 hack,它是 Laravel 自定义事物的方式。只要你不直接修改 Laravel 核心类,你就不是在破解
  • 我称它为 hack,因为我不认为 validate() 应该以这种方式使用。我不相信Request 中的任何内容都应该符合 OP 的要求。他可能有充分的理由,但从他的陈述来看,控制器完全按照他的意愿行事。
  • 我认为他想要一种快速将 json 响应错误或成功返回到 json 请求的方法,我相信这不是一个坏习惯。验证仍将正常工作。我认为这取决于 OPs 应用程序流程。
  • 正如您所说,我想将 ajax 响应移出控制器(并移入请求),因为首先,我想一遍又一遍地使用成功响应功能。其次,如果是ajax请求,我不想创建item,我只想让它在后端验证并告诉我没问题。
猜你喜欢
  • 2015-12-24
  • 2023-03-14
  • 1970-01-01
  • 2015-08-07
  • 2016-09-20
  • 1970-01-01
  • 2022-03-24
  • 2017-11-14
  • 2016-05-20
相关资源
最近更新 更多