ThinkSSL🔒 一键申购 5分钟快速签发 30天无理由退款 购买更放心 广告
## 插件中间件 插件中间件用于访问插件前台、或前台、后台时对HTTP请求拦截或过滤。例如你可以使用中间件控制哪些方法需要登录才能访问。 <blockquote class="danger"><p>注意:2.1.220220版本暂时不支持控制器中间件,访问插件前台可以使用的addonMiddleware事件,该事件监听所有访问插件前台的操作,详情前往插件事件了解。</p></blockquote> ## 创建中间件 中间件放置于:addons/demo/middleware/ ![](https://img.kancloud.cn/52/f6/52f6f241e0b4d75a4bdc422d00fbc1d4_275x202.png) 示例代码: ~~~ <?php declare (strict_types=1); namespace addons\demo\middleware; class Login { // handle 为入口执行方法,必须。第一个参数是`Request`对象,第二个参数是一个闭包。 public function handle($request, \Closure $next) { // 判断session里面有用户信息,没有说明没有登录,跳转到登录页 if (!$request->session('User')) { return redirect((string)addons_url('login/index')); } return $next($request); } } ~~~ `前置中间件`:写在请求具体操作前为前置中间件,即:`$next($request);`前,如上面所示 `后置中间件`:执行完请求后为后置中间件,即:`$next($request);`后面 ~~~ <?php declare (strict_types=1); namespace addons\demo\middleware; class Login { // handle 为入口执行方法,必须。第一个参数是`Request`对象,第二个参数是一个闭包。 public function handle($request, \Closure $next) { $response = $next($request); // 需要的操作 ... // 返回响应 return $response; } } ~~~ 中间件传值到控制器方法 ~~~ <?php declare (strict_types=1); namespace addons\demo\middleware; class Login { // handle 为入口执行方法,必须。第一个参数是`Request`对象,第二个参数是一个闭包。 public function handle($request, \Closure $next) { $request->Demo = 1; // 控制器里面 request()->Demo 即可获取值 return $next($request); } } ~~~ ## 使用中间件 执行顺序分别为: > 插件全局中间件->控制器中间件 ## 插件全局中间件 内置有插件全局中间件,可通过`addonMiddleware`事件来执行。 ## 控制器中间件 控制器中间件在插件控制器里面注册,如下,定义后访问Index控制器的任意方法都会经过中间件。 ~~~ <?php namespace addons\demo\controller; use think\addons\Controller; class Index extends Controller { // 控制器中间件 public $middleware = [ \addons\demo\middleware\Login::class ]; public function index() { echo "登录成功"; } public function login() { echo "登录页"; } } ~~~ 使用except/only来设置生效的操作 only 示例 ``` // 控制器中间件 public $middleware = [ \addons\demo\middleware\Login::class=>['only'=>['index','test']] // Login中间仅对index、test方法拦截 ]; ``` except 示例 ``` // 控制器中间件 public $middleware = [ \addons\demo\middleware\Login::class=>['except'=>[''test']] // 除了test方法,其他的所有操作方法都会经过Login中间件 ]; ```