---
### 1. 中间件技术
![图片alt](/media/editor/1621436787658_20210519044508955448.png ''图片title'')
> ### 中间件技术提供一种拦截的作用 (面向切面的思想)
#### 1.1 创建一个中间件
docker-compose exec workspace bash 进入 docker 容器中
php artisan make:middleware Benchmark
> 出现 `Middleware created successfully.`
---
<center>![图片alt](/media/editor/1621437206983_20210519045241725538.png ''图片title'')</center>
---
#### 1.2 前置和后置中间件
> ##### 前置: `请求处理之前`
> ##### 后置:`请求处理之后`
#### 在 handle 方法中出现 , 在中间件里面我们可以统一的做很多事情拦截 Request
public function handle($request, Closure $next)
{
//前置
$sTime = microtime(true);
$response = $next($request);
//后置
$runTime = microtime(true) - $sTime; //执行时间
Log::info('banchmark', [ //记录日志
'url' => $request->url(),
'input' => $request->input(),
'time' => "runTimes: " . $runTime
]);
return $response;
}
#### 1.3 注册全局中间件与路由中间件 `Kernel.php`
> ##### 注册 `全局中间件`
//全局中间件每一个中间件都会去请求
protected $middleware = [
Benchmark::class
];
> ##### 注册后查看打印的日志
tail -f storage/logs/laravel.log
> #### 这个时候我们随便访问一个路由可以看到日志在根据刚刚我们定义的日志规则输出
---
> ##### 注册 `路由中间件` 在路由文件中定义这里我们用刚刚的 web.php
Route::get('/home/hello', 'HomeController@hello')->middleware(\App\Http\Middleware\Benchmark::class);
#### 同样我们查看日志访问 /home/hello 后日志记录, 而其他地方则不会
> #### 现在我们放到路由 routeMiddleware中 `kernel.php`
protected $routeMiddleware = [
'benchmark' => \App\Http\Middleware\Benchmark::class
];
//同样我们需要修改路由的名称
Route::get('/home/hello', 'HomeController@hello')->middleware('benchmark');
> #### 我们发现这个路由是在 web 这个路由组下面 同样也是在 `kernal.php` 中 middlewareGroups
protected $middlewareGroups = [
'web' => [
'benchmark' => \App\Http\Middleware\Benchmark::class
],
];
##### `提示:这里就把 web.php 中的路由改为原来的就可以了`
---
### 1.4 在构造函数中注册中间并过滤路由
#### 设置黑名单 `except` 以上是不经过这个路由
#### 设置白名单 `only` 只有这个路由生效
class HomeController extends Controller
{
public function __construct()
{
$this->middleware(Benchmark::class, ['except' => ['hello']]); // 也可以写 except
}
public function hello()
{
return 'hello';
}
}
> #### `注意: 这里都在 kernel 需要把其他都注册删除掉可以留一个 $routeMiddleware`
#### 如何在构造函数中给中间件传参
//传递参数
$this->middleware('benchmark:test1, test1', ['except' => ['hello']]);
---
接受参数
public function handle($request, Closure $next, $a , $b)
{
//前置
$sTime = microtime(true);
$response = $next($request);
//后置
$runTime = microtime(true) - $sTime; //执行时间
Log::info('banchmark', [ //记录日志
'url' => $request->url(),
'a' => $a,
'b' => $b,
'input' => $request->input(),
'time' => "runTimes: " . $runTime
]);
return $response;
}
---
### 2. Laravel 的中间件技术
#### `全局中间件说明`
protected $middleware = [
// \App\Http\Middleware\TrustHosts::class,
\App\Http\Middleware\TrustProxies::class, //可信任代理获取真正客户端的信息
\Fruitcake\Cors\HandleCors::class, //跨域
\App\Http\Middleware\CheckForMaintenanceMode::class, //是否在维护状态
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, //检查 post 包体的大小过大就报错
\App\Http\Middleware\TrimStrings::class, //把参数去空格
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, // 把空字符串转换为 null
];
#### `中间件组说明`
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class, //处理 cookies 加密解密
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, //把 cookies 加入到 response 中
\Illuminate\Session\Middleware\StartSession::class, //处理 session
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
// \App\Http\Middleware\VerifyCsrfToken::class, // 设置 CSR 防止 CSR 攻击 验证 token 合法才能访问 保证安全性 调试的时候就注释, api 范文没必要, web 访问可以打开
\Illuminate\Routing\Middleware\SubstituteBindings::class, //显示或者隐私的 转换对象
],
'api' => [
'throttle:60,1', //限流一分钟60次
\Illuminate\Routing\Middleware\SubstituteBindings::class, //
],
];
---
#### `路由中间件`(略)
---
#### 中间件的优先级
protected $middlewarePriority = [
];
### 总结
> #### 三种分配方式
##### 1. 全局
##### 2. 分组
##### 3. 控制器