Skip to content

Conversation

@zds-s
Copy link
Contributor

@zds-s zds-s commented Sep 11, 2025

通过 Swagger 注册的路由,在控制器上使用 Middleware 注解的 priority 参数会失效。会变为默认的排序方式

复现方法

控制器中使用 priority 进行排序

#[HyperfServer(name: 'http')]
#[Middleware(middleware: AccessTokenMiddleware::class, priority: 100)]
#[Middleware(middleware: PermissionMiddleware::class, priority: 99)]
#[Middleware(middleware: OperationMiddleware::class, priority: 98)]
final class AttachmentController extends AbstractController
{
   #[Get(
        path: '/admin/attachment/list',
        operationId: 'AttachmentList',
        summary: '附件列表',
        security: [['Bearer' => [], 'ApiKey' => []]],
        tags: ['数据中心'],
    )]
    public function list(): Result
    {
        $params = $this->getRequest()->all();
        $params['current_user_id'] = $this->currentUser->id();
        if (isset($params['suffix'])) {
            $params['suffix'] = explode(',', $params['suffix']);
        }
        return $this->success(
            $this->service->page($params, $this->getCurrentPage(), $this->getPageSize())
        );
    }
}

middlewares.php 中有默认的全局中间件

use Hyperf\Validation\Middleware\ValidationMiddleware;
use Mine\Support\Middleware\CorsMiddleware;
use Mine\Support\Middleware\RequestIdMiddleware;
use Mine\Support\Middleware\TranslationMiddleware;

return [
    'http' => [
        // 请求ID中间件
        RequestIdMiddleware::class,
        // 多语言识别中间件
        TranslationMiddleware::class,
        // 跨域中间件,正式环境建议关闭。使用 Nginx 等代理服务器处理跨域问题。
        CorsMiddleware::class,
        // 验证器中间件,处理 formRequest 验证器
        ValidationMiddleware::class => 0,
    ],
];

实际结果

预期执行顺序应该是

AccessTokenMiddleware -> PermissionMiddleware -> OperationMiddleware -> middlewares.php

实际执行顺序为

middlewares.php ->AccessTokenMiddleware -> PermissionMiddleware -> OperationMiddleware

打印 Hyperf\HttpServer\Server::onRequest 的排序后结果

#Line107
        if ($this->option?->isMustSortMiddlewares() || $registeredMiddlewares) {
                var_dump($middlewares);
                $middlewares = MiddlewareManager::sortMiddlewares($middlewares);
                var_dump($middlewares);
            }
image

本次修正后的正确打印结果

image

huangdijia
huangdijia previously approved these changes Oct 29, 2025
@limingxinleo limingxinleo changed the title refactor(BootSwaggerListener): use priorityMiddleware instead of middleware Use priorityMiddleware instead of middleware for swagger. Oct 29, 2025
@limingxinleo limingxinleo merged commit 004db5f into hyperf:master Oct 29, 2025
74 checks passed
@zds-s zds-s deleted the patch-66 branch October 30, 2025 01:36
@limingxinleo limingxinleo mentioned this pull request Oct 30, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants