## 在何处使用中间件
中间件可以放置在路由文件和控制器的构造函数中,推荐放在控制器的构造函数中,这样我们每写一个方法,它自动被中间件保护起来.
#### 使用Auth中间件
__construct 是 PHP 的构造器方法,当一个类对象被创建之前该方法将会被调用。我们在 __construct 方法中调用了 middleware 方法,该方法接收两个参数,第一个为中间件的名称,第二个为要进行过滤的动作。我们通过 except 方法来设定 指定动作 不使用 Auth 中间件进行过滤,意为 —— 除了此处指定的动作以外,所有其他动作都必须登录用户才能访问,类似于黑名单的过滤机制。相反的还有 only 白名单方法,将只过滤指定动作。我们提倡在控制器 Auth 中间件使用中,首选 except 方法,这样的话,当你新增一个控制器方法时,默认是安全的,此为最佳实践。这样在该控制器中除了"register"和"login"之外所有方法都会受到auth中间件的保护,因为在注册和登录的场景下不需要对用户的身份进行验证.Laravel 提供的 Auth 中间件在过滤指定动作时,如该用户未通过身份验证(未登录用户),默认将会被重定向到 /login 登录页面。
~~~
public function __construct()
{
$this->middleware('auth',[
'except' =>['register','login']
]);
}
~~~
也可以在控制器中使用多个控制器
~~~
public function __construct()
{
$this->middleware('auth', [
'except' => ['show', 'create', 'store'] //auth中间件不应用于这三个方法
]);
$this->middleware('guest', [
'only' => ['create'] //guest 中间件只应用于create方法
]);
}
~~~
上面新增了一个中间件,只允许未登陆的用户访问注册页面,而已经登陆的用户无法访问该页面,因为不符合逻辑.