如何在Laravel上使用多个中间件组?

时间:2018-10-08 04:43:12

标签: php 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,但是每个级别都有单独的视图和一些共享的视图,但是我不能只为一种类型的用户重定向视图,因为我可以当我在与两种以上类型的用户共享的一条或多条路由上使用多个中间件时,它们就无法工作。

当我尝试操作时,它将忽略第二个或多个中间件,并重定向到路由 dashboard ,如果用户类型无法输入所需的视图,该路由即为重定向的路由。

现在我已经尝试使用以下代码:

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

并使用以下代码:

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

我也尝试过这种风格:

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

没有运气,我在做错什么吗?还是有一种更好的方法来完成我要达到的目标,请先谢谢!!

2 个答案:

答案 0 :(得分:1)

我正在使用以下代码,并且可以正常工作:

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尝试在handle()中的if之前检查用户变量。

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

答案 1 :(得分:0)

我猜你需要传递一个数组

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

如果那不起作用,我想必须将它们分开

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

     });
    });
});