如果在Laravel中$ request-> ajax(),请捕获重定向并返回json消息

时间:2017-06-14 15:21:33

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

我正在寻找一种方法来处理在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中?也许用中间件?

2 个答案:

答案 0 :(得分:0)

将中间件用于拦截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);
}

答案 1 :(得分:0)

我为RedirectResponse写了一个宏,它处理了ajax,您可以在AppServiceProvider中添加它

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

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

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