您可以在控制器或路由中以相同的方式使用中间件吗?

Can U use the middleware the same way in the controller or route?

我试图确保您不能只在顶部栏中输入 /admin。我在用户 table 中创建了一个名为 admin 的额外列,它是 0(普通用户)或 1(管理员)。

在 blade 页面中,我正在检查:

@if (Auth::check())
  @if (Auth::user()->admin == 1)
   <p>Hello Admin</p>
  @else
   <p>Hello standard user</p>
  @endif
@endif

我问的是是否可以检查路线(类似这样的事情

Route::get('/home', 'HomeController@index')->name('home')->middleware('auth')-where('admin' 1); 

或者在控制器中(类似这样的东西

public function __construct()
{
   $this->middleware('auth')->where('admin' 1);
}

您可以使用新的中间件实现此目的。

首先通过在控制台中输入来创建一个新的中间件:

php artisan make:middleware isAdmin

随便命名你的中间件,isAdmin 在这里很常见。

接下来,您必须将中间件添加到位于 app/Http/Kernel.php 的 Kernel.php,编辑名为 $routeMiddleware 的数组并添加以下内容:

'isAdmin' => \App\Http\Middleware\IsAdmin::class,

打开位于中间件文件夹中的 IsAdmin.php 并修改 handle 方法,如下所示:

{
     if (Auth::user() &&  Auth::user()->admin == 1) {
            return $next($request);
     }

    return redirect('/');
}

注意:中间件还会检查用户是否经过身份验证,因此可以用来代替管理路由的身份验证,请记住修改 return 以满足您的需要

最后,将中间件添加到您的路由中,有多种方法可以做到这一点。

  • 如果您打算使用它而不是 auth 中间件,只需在您的路由文件中将 auth 更改为 isAdmin ->middleware('isAdmin')
  • 另一种选择是像这样修改你的路由文件
Route::group(['middleware => 'auth'], function () {
    Route::get('/home', 'HomeController@index')->name('home')->middleware('isAdmin');
}

所以你不需要将中间件应用到每个路由,这里有很多可能性https://laravel.com/docs/7.x/middleware#assigning-middleware-to-routes