thinkphp6 中间件使用笔记
最近开发三频道打通程序时用到了中间件,现总结一下:
第一步:首先用命令行生成中间件
php think make:middleware Check
这个指令会 app/middleware
目录下面生成一个Check
中间件
注:需要用到几个中间件就执行几次,生成几个,此处我生成了一个check的中间件。
<?php namespace app\middleware; class Check{ public function handle($request, \Closure $next) { return $next($request); } }
会自动生成一个handle方法,并且必须返回response对象,此处为$request。
在中间件执行结束时,如果定义了end方法,会被回调执行
public function end(\think\Response $response) { // 回调行为 }
注意,在end
方法里面不能有任何的响应输出。因为回调触发的时候请求响应输出已经完成了。
中间件可以向request对象中注入变量,比如:
public function handle($request, \Closure $next) { if (preg_match('~micromessenger~i', $request->header('user-agent'))) { $request->InApp = 'WeChat'; } else if (preg_match('~alipay~i', $request->header('user-agent'))) { $request->InApp = 'Alipay'; } return $next($request); }
这里判断了useragent是微信还是支付宝,将结果注入到InApp变量中,其他地方用的判断是直接用$request->InApp就可以访问到了。
全局中间件在app
目录下面middleware.php
文件中定义,使用下面的方式:
<?php return [ \app\middleware\Auth::class, 'check', 'Hello', ];
<?php return [ [\app\middleware\Check::class,'abc'] ];
这里的abc是传入的参数,就是handle方法中第三个参数,handle($request,\Closure $next,$param),如果没有参数就直接不用数组形式就可以了。
应用中间件就是把middleware.php文件放到对应的应用里面,比如index,admin文件夹里面就可以了。
讲一下我用的的控制器中间件,不需要用到middleware.php文件,这点和tp5好像不一样。
在控制器中定义中间件:
use app\middleware\Check;
protected $middleware = [
Check::class => ['except'=> ['index']]
];
这里是除了index方法不调用中间件,其他方法都会去调用check这个中间件。这里注意中间件的命名空间,保证正常引入。
如果全部方法都要调用:
protected $middleware = [
Check::class
];