插件中间件用于访问插件前台、或前台、后台时对HTTP请求拦截或过滤。例如你可以使用中间件控制哪些方法需要登录才能访问。
注意:2.1.220220版本暂时不支持控制器中间件,访问插件前台可以使用的addonMiddleware事件,该事件监听所有访问插件前台的操作,详情前往插件事件了解。
创建中间件
中间件放置于:addons/demo/middleware/
示例代码:
<?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中间件 ];