如果 $request->ajax() 在 Laravel 中捕获重定向并返回 json 消息
Posted
技术标签:
【中文标题】如果 $request->ajax() 在 Laravel 中捕获重定向并返回 json 消息【英文标题】:Catch redirect and return json message if $request->ajax() in Laravel 【发布时间】: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 中?也许有中间件?
【问题讨论】:
【参考方案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', []);
【讨论】:
以上是关于如果 $request->ajax() 在 Laravel 中捕获重定向并返回 json 消息的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 $request->ajax() 和 Laravel 5.4 检查请求是不是为 ajax