首页 > 解决方案 > 如何在 Laravel 上使用多个中间件组?

问题描述

我正在尝试将路由的访问限制在我使用 Laravel 5.7 编写的站点中的某些类型的用户,现在我正在尝试使用中间件来实现。

对于每个用户的级别,我都有一个带有此代码的中间件(类型有所不同):

public function handle($request, Closure $next)
{
    if(Auth::user()->type==3)
        return $next($request);
    else
        return redirect()->route('dashboard');
}

kernel.php文件中,我将它们写成这样:

protected $routeMiddleware = [
    ...
    'teacher' => \App\Http\Middleware\RedirectIfTeacher::class,
    ...
]

在我的应用程序中,每个用户都有一个级别,从 1 到 5,但每个级别都有单独的视图和一些共享视图,但我无法为不止一种类型的用户重定向视图,因为我不能当我在与两种以上类型的用户共享的路由(或路由)上使用多个中间件时,它们会起作用。

当我尝试时,它只是忽略第二个或更多中间件并重定向到路由仪表板,如果用户类型无法进入所需的视图,这是重定向的路由。

现在我已经尝试过使用这段代码:

Route::group(['middleware' => ['administrator','teacher','student']], function(){

并使用此代码:

Route::group(['middleware' => ['administrator' OR 'teacher' OR 'student']], function(){

我也尝试过这种风格:

Route::group(['middleware' => ['administrator|teacher|student']], function(){

没有任何运气,我做错了什么吗?还是有更好的方法来做我想要实现的目标,在此先感谢!

标签: phplaravel

解决方案


我正在使用下面的代码并且它有效:

Route::group(['middleware' => ['administrator','teacher','student']], function() {});

1 在 kernel.php 文件中,您是否获得了分配给中间件的所有键?例如:

protected $routeMiddleware = [
...
'administrator' => \App\Http\Middleware\RedirectIfAdmin::class,
'teacher' => \App\Http\Middleware\RedirectIfTeacher::class,
'student' => \App\Http\Middleware\RedirectIfStudent::class,
...
]

2 尝试在句柄()中的 if 之前检查用户变量。

dd(Auth::user()->type);

推荐阅读