Laravel 在中间件内部重定向?

Posted

技术标签:

【中文标题】Laravel 在中间件内部重定向?【英文标题】:Laravel redirect inside of middleware? 【发布时间】:2017-04-22 10:18:55 【问题描述】:

我通过登录有一个中间件检查,用户有多少游戏,如果用户有多个游戏,我想显示另一个视图,但如果用户有多个游戏,我每次重定向错误:

以防万一$assigned_games > 1

$games = Auth::user()->userGames;
$assigned_games = count($games);

if ($assigned_games == 1) 
    return $next($request);
 elseif ($assigned_games > 1) 
    return redirect()->route('games.board');
 elseif ($assigned_games < 1) 
    echo "no game bought";
    exit;

我也尝试过只使用return route('games.board'),但它不起作用。

如何在此处设置正确的重定向?

【问题讨论】:

你得到什么错误? @AlexeyMezenin“重定向你太多次了。” 代码是正确的,但确保路由 games.board 不使用此中间件,因为如果 games.board 路由使用该中间件,它将进入重定向循环,因此您重定向的路由不应再次重定向. @Sam 是的,它在里面,是否可以在那里创建一个异常? 你应该在中间件中抛出异常,因为中间件是先执行的,然后是控制器方法。 【参考方案1】:

如果你的路由都在中间件中,那么你应该检查当前路由,如果它与你重定向的一样,你不应该重定向以避免重定向循环

$games = Auth::user()->userGames;
$assigned_games = count($games);

if ($assigned_games == 1) 
    return $next($request);
 elseif ($assigned_games > 1 && \Route::currentRouteName() != 'games.board') 
    return redirect()->route('games.board');
 elseif ($assigned_games < 1) 
    echo "no game bought";
    exit;
 else 
    return $next($request);

【讨论】:

它可以,但是我现在总是重定向到这个页面,是否可以仅通过登录来限制这个请求? 在您的路由中的此中间件之前添加身份验证中间件。所以对于前。 Route::group(['middleware' => ['auth', 'yourmiddleware']], function());然后它只有在登录后才会进入你的中间件。

以上是关于Laravel 在中间件内部重定向?的主要内容,如果未能解决你的问题,请参考以下文章

中间件,检查 Laravel 5 后如何重定向

Laravel 5 中间件 https 上的 aws ec2 重定向循环

指定URL时,Laravel无法重定向

Laravel 在区域设置更改时重定向到路由

Laravel 7:重定向到不同警卫的不同登录名

Laravel:以不同方式重定向不同的用户角色