Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
imi
imi
提交
0f5effa9
imi
项目概览
imi
/
imi
9 个月 前同步成功
通知
53
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
imi
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
0f5effa9
编写于
11月 26, 2021
作者:
weixin_47267244
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
支持禁用 HTTP 中间件
上级
56cdc52a
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
74 addition
and
16 deletion
+74
-16
doc/components/httpserver/middleware.md
doc/components/httpserver/middleware.md
+1
-0
src/Components/swoole/tests/unit/HttpServer/HttpsTestServer/config/config.php
...e/tests/unit/HttpServer/HttpsTestServer/config/config.php
+1
-4
src/Components/swoole/tests/unit/HttpServer/bin/imi
src/Components/swoole/tests/unit/HttpServer/bin/imi
+3
-3
src/Server/Http/Dispatcher.php
src/Server/Http/Dispatcher.php
+40
-3
src/Server/Http/Middleware/ActionMiddleware.php
src/Server/Http/Middleware/ActionMiddleware.php
+13
-1
src/Server/Http/Middleware/RouteMiddleware.php
src/Server/Http/Middleware/RouteMiddleware.php
+16
-5
未找到文件。
doc/components/httpserver/middleware.md
浏览文件 @
0f5effa9
...
...
@@ -56,6 +56,7 @@ return [
'beans'
=>
[
// 中间件
'HttpDispatcher'
=>
[
'middleware'
=>
true
,
// 默认启用中间件,一旦设为 false,无论是全局还是局部中间件都不生效,可以提升性能
'middlewares'
=>
[
// 中间件
\
Imi\Server\Session\Middleware\HttpSessionMiddleware
::
class
,
...
...
src/Components/swoole/tests/unit/HttpServer/HttpsTestServer/config/config.php
浏览文件 @
0f5effa9
...
...
@@ -12,10 +12,7 @@ return [
],
'beans'
=>
[
'HttpDispatcher'
=>
[
'middlewares'
=>
[
\
Imi\Swoole\Test\HttpServer\Middleware\RequestLogMiddleware
::
class
,
\
Imi\Server\Http\Middleware\RouteMiddleware
::
class
,
],
'middleware'
=>
false
,
],
],
];
src/Components/swoole/tests/unit/HttpServer/bin/imi
浏览文件 @
0f5effa9
...
...
@@ -3,9 +3,9 @@
use
Imi\Util\Imi
;
require_once
dirname
(
__DIR__
,
7
)
.
'/vendor/'
.
'autoload.php'
;
require_once
dirname
(
__DIR__
,
4
)
.
'/vendor/'
.
'autoload.php'
;
require_once
\
dirname
(
__DIR__
,
7
)
.
'/vendor/'
.
'autoload.php'
;
require_once
\
dirname
(
__DIR__
,
4
)
.
'/vendor/'
.
'autoload.php'
;
\
Imi\App
::
setDebug
(
true
);
(
require
dirname
(
Imi
::
getNamespacePath
(
'Imi\Swoole'
))
.
'/bootstrap.php'
)();
(
require
\
dirname
(
Imi
::
getNamespacePath
(
'Imi\Swoole'
))
.
'/bootstrap.php'
)();
src/Server/Http/Dispatcher.php
浏览文件 @
0f5effa9
...
...
@@ -5,9 +5,13 @@ declare(strict_types=1);
namespace
Imi\Server\Http
;
use
Imi\Bean\Annotation\Bean
;
use
Imi\RequestContext
;
use
Imi\Server\Annotation\ServerInject
;
use
Imi\Server\Http\Message\Contract\IHttpRequest
;
use
Imi\Server\Http\Message\Contract\IHttpResponse
;
use
Imi\Server\Http\Message\Response
;
use
Imi\Server\Http\Middleware\ActionMiddleware
;
use
Imi\Server\Http\Middleware\RouteMiddleware
;
/**
* @Bean("HttpDispatcher")
...
...
@@ -21,6 +25,21 @@ class Dispatcher
*/
protected
array
$middlewares
=
[];
/**
* 是否启用中间件.
*/
protected
bool
$middleware
=
true
;
/**
* @ServerInject("RouteMiddleware")
*/
protected
RouteMiddleware
$routeMiddleware
;
/**
* @ServerInject("ActionMiddleware")
*/
protected
ActionMiddleware
$actionMiddleware
;
/**
* 最终使用的中间件列表.
*/
...
...
@@ -31,9 +50,27 @@ class Dispatcher
*/
public
function
dispatch
(
IHttpRequest
$request
):
IHttpResponse
{
$requestHandler
=
new
RequestHandler
(
$this
->
getMiddlewares
());
/** @var Response $response */
$response
=
$requestHandler
->
handle
(
$request
);
if
(
$this
->
middleware
)
{
$requestHandler
=
new
RequestHandler
(
$this
->
getMiddlewares
());
/** @var Response $response */
$response
=
$requestHandler
->
handle
(
$request
);
}
else
{
$context
=
RequestContext
::
getContext
();
$response
=
$context
[
'response'
];
$result
=
$this
->
routeMiddleware
->
dispatch
(
$request
,
$response
);
if
(
null
!==
$result
)
{
$response
=
$context
[
'response'
]
=
$result
;
}
$result
=
$this
->
actionMiddleware
->
dispatch
(
$request
,
$response
);
if
(
null
!==
$result
)
{
$response
=
$context
[
'response'
]
=
$result
;
}
}
$response
->
send
();
return
$response
;
...
...
src/Server/Http/Middleware/ActionMiddleware.php
浏览文件 @
0f5effa9
...
...
@@ -55,8 +55,20 @@ class ActionMiddleware implements MiddlewareInterface
// 获取Response对象
$response
=
$handler
->
handle
(
$request
);
// 获取路由结果
RequestContext
::
set
(
'response'
,
$response
);
$result
=
$this
->
dispatch
(
$request
,
$response
,
$handler
);
if
(
null
===
$result
)
{
return
$response
;
}
return
$result
;
}
public
function
dispatch
(
ServerRequestInterface
$request
,
ResponseInterface
$response
,
?RequestHandlerInterface
$handler
=
null
):
?ResponseInterface
{
$context
=
RequestContext
::
getContext
();
$context
[
'response'
]
=
$response
;
// 获取路由结果
if
(
null
===
(
$result
=
$context
[
'routeResult'
]))
{
throw
new
\
RuntimeException
(
'RequestContent not found routeResult'
);
...
...
src/Server/Http/Middleware/RouteMiddleware.php
浏览文件 @
0f5effa9
...
...
@@ -8,6 +8,7 @@ use Imi\Bean\Annotation\Bean;
use
Imi\RequestContext
;
use
Imi\Server\Annotation\ServerInject
;
use
Imi\Server\Http\Error\IHttpNotFoundHandler
;
use
Imi\Server\Http\RequestHandler
;
use
Imi\Server\Http\Route\HttpRoute
;
use
Psr\Http\Message\ResponseInterface
;
use
Psr\Http\Message\ServerRequestInterface
;
...
...
@@ -33,6 +34,18 @@ class RouteMiddleware implements MiddlewareInterface
* {@inheritDoc}
*/
public
function
process
(
ServerRequestInterface
$request
,
RequestHandlerInterface
$handler
):
ResponseInterface
{
$context
=
RequestContext
::
getContext
();
$response
=
$this
->
dispatch
(
$request
,
$context
[
'response'
],
$handler
);
if
(
null
===
$response
)
{
return
$handler
->
handle
(
$request
);
}
return
$context
[
'response'
]
=
$response
;
}
public
function
dispatch
(
ServerRequestInterface
$request
,
ResponseInterface
$response
,
?RequestHandlerInterface
$handler
=
null
):
?ResponseInterface
{
$context
=
RequestContext
::
getContext
();
// 路由解析
...
...
@@ -42,15 +55,13 @@ class RouteMiddleware implements MiddlewareInterface
{
// 未匹配到路由
// @phpstan-ignore-next-line
$response
=
$this
->
notFoundHandler
->
handle
(
$handler
,
$request
,
$context
[
'response'
]);
$context
[
'response'
]
=
$response
;
return
$this
->
notFoundHandler
->
handle
(
$handler
??
new
RequestHandler
([]),
$request
,
$response
);
}
else
{
$context
[
'routeResult'
]
=
$result
;
$response
=
$handler
->
handle
(
$request
);
}
return
$response
;
return
null
;
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录