要在 workerman 4.0.20 中实现 laravel 风格中间件管道,需手动构建 pipeline 执行器:定义 pipeline 类封装中间件队列与 then() 入口,各中间件统一实现 handle(request $req, closure $next): response 签名,通过 onmessage 中解析 request、实例化 pipeline 并链式调用,最终 send response;注意命名空间路径、异常捕获及禁止 exit/die。

要在 Workerman 4.0.20 中实现类似 Laravel 或 Webman 风格的中间件管道(pipeline),必须绕过框架原生不支持“中间件链式调用”的限制,手动构建 request → middleware1 → middleware2 → … → handler 的执行流。Workerman 本身只提供 onMessage、onConnect 等事件回调,不内置中间件注册与调度机制,因此需自行封装 pipeline 执行器。
定义中间件接口与基础 Pipeline 类
创建 src/Middleware/Pipeline.php,实现标准的 pipe-call-next 模式:
新建一个空数组存储中间件类名或闭包;定义 【$stack】 属性用于暂存中间件队列;构造函数接收中间件列表并赋值给 $stack;提供 then(Closure $destination) 方法作为管道终点,启动执行流程。
这一步不能跳过——若未定义 then 方法,后续无法触发业务逻辑入口,整个管道将悬空。
编写具体中间件类
每个中间件必须实现统一签名:接受 Request $request 和 Closure $next,返回 Response 实例。
例如权限中间件:class AuthMiddleware { public function handle(Request $request, Closure $next): Response { if (!$request->hasHeader('X-Token')) { return new Response(401, [], 'Unauthorized'); } return $next($request); } }
日志中间件可直接写入 file_put_contents('log/middleware.log', date('Y-m-d H:i:s') . "
", FILE_APPEND);,无需返回响应,但【必须调用 $next($request) 否则中断链路】。
在 Worker 中集成管道
第一步:在 onMessage 回调开头,从原始 HTTP 数据中解析出 Request 对象(可用 WorkermanHttpRequest::parse() 或自定义解析)。
第二步:实例化 Pipeline,传入中间件数组,例如 new Pipeline([AuthMiddleware::class, LogMiddleware::class])。
第三步:调用 ->then(fn($req) => $this->handleBusiness($req)),其中 handleBusiness 是你真正的业务处理方法。
第四步:将 Pipeline 返回的 Response 对象通过 $connection->send($response->toString()) 发送给客户端。
关键注意事项
中间件类必须是完整命名空间路径,如 'app\middleware\AuthMiddleware',否则自动加载失败。
所有中间件中的异常必须被显式捕获,Workerman 不会自动兜底——未 catch 的 Exception 将导致当前连接崩溃,且无日志输出。
不要在中间件中使用 exit 或 die,这会杀死整个 worker 进程,【应始终返回 Response 对象终止流程】。











