插件中间件用于访问插件前台、或前台、后台时对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中间件
    ];