weskiller / hyperf-middleware
0.4.0
2021-11-11 09:16 UTC
Requires
- php: ^8.0
- hyperf/config: ^2.2
- hyperf/di: ^2.2.4
- hyperf/http-server: ^2.2
- hyperf/websocket-server: ^2.2
Requires (Dev)
- hyperf/testing: ^2.2
This package is auto-updated.
Last update: 2025-03-11 17:09:30 UTC
README
Hyperf 组件,支持中间件传参, 编排。
注意
框架核心组件被替换
- 通过继承类的方式替换了hyperf/http-server,hyperf/Router 组件的核心实现。可能存在副作用。
路由配置格式变更
- 路由参数
middleware
中间件不兼容
- 不兼容 Hyperf\HttpServer\Annotation\Middleware,需要使用 Weskiller\HyperfMiddleware\Middleware 替换
- Hyperf 会将同一个路由上重复中间件去重,在带参情况下,这一策略不适用。
中间件编排
- 编排策略对全局中间件生效
- 对于未定义的路由,全局中间件依旧有效
路由
- 将强制使用
/
分割路由
WebSocket
- 如果使用了
hyperf/websocket-server
,还需要替换websocket
的回调
测试
- 如何使用了
hyperf/testing
,需要替换Hyperf\Testing\Client
为Weskiller\HyperfMiddleware\Test\Client
使用
配置
- 修改 config/autoload/server.php 文件
<?php use Hyperf\Server\Event; use Hyperf\Server\Server; return [ 'mode' => SWOOLE_PROCESS, 'servers' => [ [ 'name' => 'http', 'type' => Server::SERVER_HTTP, /** * */ 'callbacks' => [ Event::ON_REQUEST => [Weskiller\HyperfMiddleware\Http\Server::class, 'onRequest'], ], ], //如果还使用了websocket [ 'name' => 'websocket', 'type' => Server::SERVER_WEBSOCKET, /** * */ 'callbacks' => [ Event::ON_HAND_SHAKE => [Weskiller\HyperfMiddleware\WebSocket\Server::class, 'onHandShake'], Event::ON_MESSAGE => [Weskiller\HyperfMiddleware\WebSocket\Server::class, 'onMessage'], Event::ON_CLOSE => [Weskiller\HyperfMiddleware\WebSocket\Server::class, 'onClose'], ], ], ], 'settings' => [ /** * */ ], 'callbacks' => [ /** * */ ], ];
- 修改 annotations.php 文件, 新增中间件收集器
<?php 'scan' => [ /* ... */ 'collectors' => [ Weskiller\HyperfMiddleware\Middleware\Collector::class, ] ],
使用路由配置文件定义
<?php use App\Controller\DeveloperController; use App\Middleware\CommonMiddleware; use App\Middleware\NeedParametersMiddleware; use App\Middleware\NeedTwoParameterMiddleware; use Hyperf\HttpServer\Router\Router; use Weskiller\HyperfMiddleware\Middleware\Middleware; use Weskiller\HyperfMiddleware\Middleware\Direct; use Weskiller\HyperfMiddleware\Middleware\Exclude; use Weskiller\HyperfMiddleware\Middleware\Expect; Router::get( '/debug', [DeveloperController::class,'index'], [ 'middleware' => [ CommonMiddleware::class, //default [NeedParametersMiddleware::class,'parameters'], //with parameters new Middleware(NeedTwoParameterMiddleware::class,'parameter1','parameter2'), //use instance ], Exclude::Option => [ CommonMiddleware::class //exclude ], Expect::Option => [ NeedParametersMiddleware::class //expect ], Direct::Option => ture //skip all middlewares ], );
使用注解定义
<?php namespace App\Controller; use App\Middleware\CommonMiddleware; use App\Middleware\NeedParametersMiddleware; use App\Middleware\NeedTwoParameterMiddleware; use Hyperf\HttpServer\Annotation\Controller; use Weskiller\HyperfMiddleware\Middleware\Middleware; use Weskiller\HyperfMiddleware\Middleware\Direct; use Weskiller\HyperfMiddleware\Middleware\Exclude; use Weskiller\HyperfMiddleware\Middleware\Expect; #[Controller(prefix='developer')] class DeveloperController { #[RequestMapping(method:["GET"],value: 'debug')] #[Middleware(CommonMiddleware::class)] //default #[ParameterMiddleware(NeedParametersMiddleware::class,"parameter")] //with parameters #[ParameterMiddleware(NeedTwoParameterMiddleware::class,"parameter")] //multiple middleware #[Exclude([NeedTwoParameterMiddleware::class])] //exclude #[Expect([NeedParametersMiddleware::class])] //expect #[Direct] //skip all middlewares public function index(ServerRequestInterface $request) { $user = $request->input('user', 'Hyperf'); $method = $request->getMethod(); return [ 'method' => $method, 'message' => "Hello {$user}.", ]; } }