轻松使用Laravel6中间件

作者: 温新

分类: 【Laravel】

阅读: 3394

时间: 2019-10-21 17:15:42

一、什么是中间件?

什么是Laravel的中间件?简而言之就是一套过滤所有HTTP请求的机制。

解释:

1) 一个HTTP请求(URL)发起时,经过路由之后会被分发到中间件,中间件这里就可以拦截路由进行判断,符合要求才会允许访问路由对应的方法。

![H$]685Y9UV9SN5WW(}]MPN5.png](/ueditor/php/upload/image/20191022/1571678055118516.png "1571678055118516.png")

2)听起来还是有些懵,下面举个例来理解。

一个房子所对应进出房子的大门,你是房子的主人,你下班回家,到了门口掏出钥匙,门锁就会判断你这个钥匙是不是我这把锁的钥匙,如果是,门锁就会放行,打开门,让你进去,进入家后,想干嘛就干嘛。如果门锁验证你的钥匙不对,就会发出在中间件中定义好的操作,比如,年轻人,你这把钥匙不是我这把锁的,哪来就回哪去吧。

再来梳理一下这个流程,你就是用户,你拿起钥匙开锁就是发起一个请求,门锁就是中间件,判断你这个钥匙对不对,验证钥匙通过过,打开门就是对应的控制器方法。验证不通过就对应着我们在中间件所定义的操作。

二、定义中间件

这里不深入源码,只写如何使用中间件。

php artisan make:middleware TestA

该命令会在app/Http/Middleware目录下生成一个TestA的类文件,这就是中间件文件,且是一个前置中间件。

三、编写中间件逻辑

如,判断用户是否登陆,未登陆重定向到首页

public function handle($request, Closure $next)
{
    if(!session('name')){
        return redirect('/');
    }
    return $next($request);
}

四、注册中间件 app/Http/Kernel.php

编辑 app/Http/Kernel.php 文件在 $routeMiddleware属性中添加

protected $routeMiddleware = [
    ...     // 省略原有的中间件代价
    'testa' =>  \App\Http\Middleware\TestA::class,
];

到这里中间件就定义好了,可以在路由中使用了。

补充:

1) 前置中间件,就是在对应的控制器方法之前执行
cookie验证:验证用户的cookie
用户角色验证:定义不同的用户角色并验证
用户权限验证:配置不同的用户权限,并验证安全相关,如CSRF校验:CSRF校验中间件
http方法过滤:过滤特定的GET POST请求
http或者page cache:对指定路径的页面进行缓存
跨域中间件:不用在nginx配置,而是通过框架的方式,针对某些域名或某些请求,提供跨域的服务。

2) 后置中间件,就是在对应的控制器方法执行之后执行

共同数据输出:针对统一业务的公共数据,在后置中统一输出更新日志

3) protected $middleware,全局中间件,无论执行什么请求一定会执行该中间件 4) protected $middlewareGroups,中间件组 5) protected $routeMiddleware,路由中间件,只有在定义路由的时候才会使用。我们这里使用的就是路由中间件

五、使用中间件

创建控制器
php artisan make:controller TestaController

定义路由 app/routes/web.php
Route::get('testa/seta' , 'TestaController@setA');
Route::get('testa/a' , 'TestaController@A')->middleware('testa');
Route::get('testa/b' , 'TestaController@B')->middleware('testa');

定义控制器方法
public function setA() { session(['name'=>'李四']); }

public function A() { return 'A方法,登陆后才能看到我~~'; }

public function B() { return 'B方法,登陆后才能看到我~~'; }

中间件到这里就完成了,再补充一点,后置中间件,如上面的步骤几乎都是一样的,唯一不同的就是中间件的方法。下面就是一个后置中间件的案例。

public function handle($request, Closure $next)
{
    $response = $next($request);
    Log::info('我实在请求之后执行的');
    return $response;
}

我是夕阳何处寻,期待和优秀的你一起同行!

夕阳何处寻

2019年10月22

请登录后再评论