关于全局与应用插件中间件的问题

uk8u8

问题描述

请问应用插件(plugin)的正常执行流程里会执行全局中间件么?

我的测试:

  1. 全新安装webman/admin并登录后台
  2. 安装redis-queue管理应用插件
  3. 新建中间件app/middleware/Test.php

    class Test implements MiddlewareInterface
    {
    public function process(Request $request, callable $handler) : Response
    {
        echo $request->url() . PHP_EOL;
        echo 'TestMiddleware' . PHP_EOL;
    
        $response = $handler($request);
    
        return $response;
    }
    }
  4. 修改config/middleware.php配置文件
    return [
    '' => [
        app\middleware\Test::class,
    ]
    ];
  5. 启动应用
    php start.php start

测试结果

  1. 访问app/admin应用不会执行全局中间件。
  2. 访问后台的app/queue应用下的控制器,有一定的机率会执行全局中间件。

这个结果让我有点懵。目前问题我也无法针对性的复现,开发过程中,访问后台app/queue下的控制器时不时的会执行全局中间件。我看app/queue下的路由配置里,有个闭包路由:

Route::any('/app/queue', function () {
    return response()->withFile(base_path() . '/plugin/queue/public/index.html');
});

看请求url//127.0.0.1:8787/app/queue及请求控制器名称为空,貌似是这个闭包路由执行了全局中间件?但时有时无。。
求解惑,谢谢!

635 1 1
1个回答

walkor

除了路由配置是全局的,其它配置插件与插件之间以及插件与主配置之间不互相影响的,包括中间件。
目前判断一个请求是否属于某个插件,不是通过url来判断的,而是通过实际调用的控制器是否以\plugin\xxx开头来判断的(这里下个版本可能会优化)。
目前的机制由于闭包函数不是控制器,所以不属于任何插件,所以会调用主项目全局中间件。

这里后期可能会优化为:如果路由设置的是闭包,那么将通过url来判断是否属于某个插件的请求,就不会有这个疑问了。

  • uk8u8 2022-12-12

    感谢。明白了。期待发版!

  • walkor 2022-12-12

    发了一个小版本,composer require workerman/webman-framework ^v1.4.10 试下
    当路由设置的是一个函数或者闭包是,插件名通过url来获取

  • uk8u8 2022-12-12

    亲测正常!太迅速了。。^_^

年代过于久远,无法发表回答
🔝