Laravel学习笔记基础系列--(九)详解Laravel中间件的快速使用
作者:温新
时间:2021-06-25
什么是Laravel中间件
简而言之,Laravel中间件就是一套过滤所有HTTP请求的机制。一个请求到达控制器方法前要经过中间件,因此,在中间件这个位置就可以对请求进行过滤。
白话理解中间件:
-
1、一个HTTP请求(URL)发起时,经过路由之后会被分发到中间件,中间件这里就可以拦截路由进行判断,符合要求才会允许访问路由对应的方法。
-
2、听起来还是有些懵,下面举个例来理解。
一个房子所对应进出房子的大门,你是房子的主人,你下班回家,到了门口掏出钥匙,门锁就会判断你这个钥匙是不是我这把锁的钥匙,如果是,门锁就会放行,打开门,让你进去,进入家后,想干嘛就干嘛。如果门锁验证你的钥匙不对,就会发出在中间件中定义好的操作,比如,年轻人,你这把钥匙不是我这把锁的,哪来就回哪去吧。
再来梳理一下这个流程,你就是用户,你拿起钥匙开锁就是发起一个请求,门锁就是中间件,判断你这个钥匙对不对,验证钥匙通过过,打开门就是对应的控制器方法。验证不通过就对应着我们在中间件所定义的操作。
快速使用中间件
用法:php artisan make:middleware 中间件名称
生成文件位置:app/Http/Middleware
第一步:创建中间件
php artisan make:middleware DemoCheck
该命令会在app/Http/Middleware目录下生成一个DemoCheck
的类文件,这就是中间件文件,且是一个前置中间件。
第二步:编写中间件逻辑
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class DemoCheck
{
public function handle(Request $request, Closure $next)
{
if ($request->testId > 20) {
return redirect('/');
}
return $next($request);
}
}
代码解释:如果接收到的参数testId大于20,那么就阻止路由继续往下走到控制器方法,并返重定向到首页。若testId参数小于20,则通过调回函数$next()
将请求继续往下传递。
第三步:注册中间件
中间件分类三类:全局中间件、中间件组、指定路由中间件。这个案例中使用路由中间件。
全局中间件的注册需要在app/Http/Kernel.php
中的$middleware
数组属性中进行。
// app/Http/Kerner.php
protected $routeMiddleware = [
'testId'=>\App\Http\Middleware\DemoCheck::class,
];
到这里,中间件使用就可以使用了。
第四步:定义路由器
// web.php
Route::get('demo/{testId}', 'DemoController@index')->middleware('testId');
由于注册的是路由中间件,因此定义的中间件一定要定义到具体的路由上。
前置/后置中间件
前置中间件
如上中间件的快速使用,使用的是前置中间件。
**什么是前置中间件?**前置中间件,请求没有到达所对应的控制器方法就被拦截了。举个不恰当的例子,一个入室盗窃的小偷,刚要拿出撬门的工具时就被警察叔叔给抓住了。
// DemoCheck.php
public function handle($request, Closure $next)
{
// 前置中间件
// 这里写处理逻辑
return $next($request);
}
主要注意的是,使用前置中间件时,如使用$request->all()接收用户参数的方法是无效的,是接收不到用户参数的。
后置中间件
什么是后置中间件后置中间件,就是请求会到达所对应的控制器的具体方法。举个不恰当的例子,一个入室盗窃的小偷,已经撬门而入且得手了贵重物品,刚出门口就被警察叔叔给抓了。
改造中间件为后置请求:
// DemoCheck.php
public function handle(Request $request, Closure $next)
{
$response = $next($request);
// 后置中间件
if ($request->testId > 20) {
return redirect('/');
}
return $response;
}
改造控制器方法
// DemoController.php
public function store(Request $request)
{
dd($request->all());
}
访问路由你的域名/demo/1111
,路由中携带testId=1111
,此时是大于20的,它首先会被重定向到首页吗?答案是它先打出控制器方法中的数据,然后才被重定向后首页,这就是后置中间件。
前置与后置中间件怎么用?请参考 轻松使用Laravel6中间件 这篇文章。
中间件传递参数
用法 :Route::get()->middleware('中间件名:参数')
注意:若有多个参数,则使用逗号分隔,如middleware('testId:参数1,参数2')
中间件可以携带参数。此处的参数不是用户参数,而是由开发人员所指定的附加参数,常用于判断用户权限。
下面基于最开始所使用的后置中间件案例,开始改造:
修改路由。中间件参数接收的是值,而不是键。
// web.php
Route::get('demo/{testId}', 'DemoController@index')->middleware('testId:id,name');
修改中间件
// DemoCheck.php
public function handle(Request $request, Closure $next, $id,$name)
{
// 打印中间件参数
dump($id);
dd($name);
// 此处为了节约篇幅,省略后面代码
}
我是温新
每天进步一点点,就一点点