如果 $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 消息的主要内容,如果未能解决你的问题,请参考以下文章

将 Ajax 响应分配给 php 变量

无法使用 $request->ajax() 和 Laravel 5.4 检查请求是不是为 ajax

jquery ajax获取后台request中的值 ,前台AJAX如下,后台如图

jsp用ajax往后台如何传request值

如何在 laravel 中使用 ajax 验证输入数据

djange表操作和ajax