Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
捕获重定向并返回json消息(如果$request->;Laravel中的ajax()_Ajax_Forms_Laravel_Laravel Routing_Laravel Middleware - Fatal编程技术网

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

捕获重定向并返回json消息(如果$request->;Laravel中的ajax(),ajax,forms,laravel,laravel-routing,laravel-middleware,Ajax,Forms,Laravel,Laravel Routing,Laravel Middleware,我正在寻找一种在Laravel中提交表单后处理重定向的方法。我的控制器方法(存储/更新)的末尾有一行: return redirect()->route('admin.templates.edit', ['id' => $template->id]); 如果表单是通过ajax提交的,我想截取此重定向(如果可能)并返回一条json消息: 到目前为止,我必须在每种方法中都写下这一点: if (request()->ajax()) { return [

我正在寻找一种在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请求所需的所有路由。您可以几乎完全按照现有的方式使用代码:

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);
}

我为
RedirectResponse
编写了一个宏,用于处理ajax,您可以将其添加到
AppServiceProvider

RedirectResponse::macro('withAjax', function ()
{
    /* @var $this RedirectResponse */
    return request()->ajax() ? ['redirect' => $this->getTargetUrl()] : $this;
});
现在在控制器中,您可以简单地使用

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