【问题标题】:Catch redirect and return json message if $request->ajax() in Laravel如果 $request->ajax() 在 Laravel 中捕获重定向并返回 json 消息
【发布时间】:2017-11-16 20:12:45
【问题描述】:

我正在寻找一种在 Laravel 中提交表单后处理重定向的方法。我的控制器方法(存储/更新)最后有这一行:

return redirect()->route('admin.templates.edit', ['id' => $template->id]);

如果表单是通过 ajax 提交的,我想拦截此重定向(如果可能)并返回 json 消息:

现在我必须在每个方法中都写这个:

if (request()->ajax()) {
    return [
        'redirect' => route('admin.templates.edit', ['id' => $template->id])
    ];
}
return redirect()->route('admin.templates.edit', ['id' => $template->id]);

如果请求是通过 ajax 发出的,有没有办法编写“正常”重定向并封装在 json 中?也许有中间件?

【问题讨论】:

    标签: ajax forms laravel laravel-routing laravel-middleware


    【解决方案1】:

    对拦截 Ajax 请求所需的所有路由使用中间件。您几乎可以完全按照自己的方式使用代码:

    if (request()->ajax()) {
    return [
        'redirect' => route('admin.templates.edit', ['id' => $template->id])
    ];
    }
    
    return redirect()->route('admin.templates.edit', ['id' => $template->id]);
    

    并从中间件相应地采取行动。

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  $guard
     * @return mixed
     */
    public function handle($request, Closure $next, $guard = null)
    {
        if (request()->ajax()) {
            return response()->redirect(route('admin.templates.edit', ['id' => $template->id]));
        }
        return $next($request);
    }
    

    【讨论】:

      【解决方案2】:

      我为RedirectResponse写了一个宏来处理ajax你可以添加到AppServiceProvider

      RedirectResponse::macro('withAjax', function ()
      {
          /* @var $this RedirectResponse */
          return request()->ajax() ? ['redirect' => $this->getTargetUrl()] : $this;
      });
      

      现在在您的控制器中,您可以简单地使用它

      return redirect()->back()->macroCall('withAjax', []);

      【讨论】:

        猜你喜欢
        • 2013-11-19
        • 2020-11-17
        • 1970-01-01
        • 2012-12-25
        • 1970-01-01
        • 2021-05-22
        • 1970-01-01
        • 2021-01-18
        • 2023-03-25
        相关资源
        最近更新 更多