中间件

中间件主要用于拦截或过滤应用的HTTP请求.

中间件的本质是一个洋葱模型

1.jpg

图中的顺序为按照 Middleware A -> Middleware B 的顺序组织着

我们可以注意到当中间的横线穿过 Core App,又回到了 Middleware B,为一个嵌套模型,那么实际的顺序其实就是:

Request -> Middleware A -> Middleware B -> Core App -> Middleware B -> Middleware A -> Response

定义中间件

php think make:middleware Check

这个指令会 app/middleware目录下面生成一个Check中间件。

<?php
declare (strict_types = 1);

namespace app\middleware;

class Check
{
    /**
     * 处理请求
     *
     * @param \think\Request $request
     * @param \Closure       $next
     * @return Response
     */
    public function handle($request, \Closure $next)
    {
        //
    }
}

中间件的入口执行方法必须是handle方法,而且第一个参数是Request对象,第二个参数是一个闭包。返回值也必须是一个Response对象

中间件是在请求具体的操作之前还是之后执行,完全取决于中间件的定义本身。

前置中间件 对应于上图的 Request -> Middleware A -> Core App Middleware A 部分

public function handle($request, \Closure $next)
{
	// 添加中间件执行代码
   
	return $next($request);
}

后置中间件 对应于上图的 Core App -> Middleware A -> Response Middleware A 部分

public function handle($request, \Closure $next)
{
	$response = $next($request);
	// 添加中间件执行代码

	return $response;
}

全局中间件 在app目录下面middleware.php文件中定义,我们之前启动session的时候就已经说到了.

通常还会配合路由定义中间件

Route::group('hello', function(){
	Route::rule('hello/:name','hello');
})->middleware('check');

还有控制器中间件只需要在控制器中定义middleware属性 protected $middleware = ['check'];

那么说了这么多,中间件具体有什么实际用途呢?

  • 权限验证

  • 添加跨域响应头

  • 记录日志

还有很多实际用途,其根本也是降低了系统的耦合.