中间件
优质
小牛编辑
133浏览
2023-12-01
开发者可以开发中间件类,对整个WebSocket请求和响应过程进行自定义处理。
注意!最好不要在中间件中使用类属性,可能会造成冲突!
定义中间件
<?php
namespace Imi\Server\WebSocket\Middleware;
use Imi\RequestContext;
use Imi\Bean\Annotation\Bean;
use Imi\Server\WebSocket\Message\IFrame;
use Imi\Server\WebSocket\MessageHandler;
use Imi\Server\WebSocket\IMessageHandler;
/**
* @Bean
*/
class RouteMiddleware implements IMiddleware
{
/**
* 处理方法
*
* @param IFrame $frame
* @param IMessageHandler $handler
* @return void
*/
public function process(IFrame $frame, IMessageHandler $handler)
{
// 前置处理
// 先执行其它中间件
$result = $handler->handle($frame);
// 后置处理
return $result;
}
}
全局中间件
return [
'beans' => [
// 中间件
'WebSocketDispatcher' => [
'middlewares' => [
// 中间件
\Imi\Server\WebSocket\Middleware\RouteMiddleware::class,
],
],
],
];
局部中间件
注解使用
<?php
namespace ImiDemo\WebSocketDemo\MainServer\WSController\Index;
use Imi\ConnectContext;
use Imi\Controller\WebSocketController;
use Imi\Server\Route\Annotation\WebSocket\WSRoute;
use Imi\Server\Route\Annotation\WebSocket\WSAction;
use Imi\Server\Route\Annotation\WebSocket\WSController;
use Imi\Server\Route\Annotation\WebSocket\WSMiddleware;
/**
* 数据收发测试
* @WSController
*/
class Test extends WebSocketController
{
/**
* test
*
* @WSAction
* @WSRoute({"action"="login"})
* @WSMiddleware(XXX::class)
* @WSMiddleware({XXX::class,XXX2::class})
* @return void
*/
public function test($data)
{
}
}
如上代码,同时支持设置单个和多个中间件
中间件分组
服务器 config.php:
return [
'middleware' => [
'groups' => [
// 组名
'test' => [
// 中间件列表
\Imi\Test\HttpServer\ApiServer\Middleware\Middleware4::class,
],
],
],
];