我正在寻找一种方法来处理在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中?也许用中间件?
答案 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', []);