提交 0f5effa9 编写于 作者: weixin_47267244's avatar weixin_47267244

支持禁用 HTTP 中间件

上级 56cdc52a
......@@ -56,6 +56,7 @@ return [
'beans' => [
// 中间件
'HttpDispatcher' => [
'middleware' => true, // 默认启用中间件,一旦设为 false,无论是全局还是局部中间件都不生效,可以提升性能
'middlewares' => [
// 中间件
\Imi\Server\Session\Middleware\HttpSessionMiddleware::class,
......
......@@ -12,10 +12,7 @@ return [
],
'beans' => [
'HttpDispatcher' => [
'middlewares' => [
\Imi\Swoole\Test\HttpServer\Middleware\RequestLogMiddleware::class,
\Imi\Server\Http\Middleware\RouteMiddleware::class,
],
'middleware' => false,
],
],
];
......@@ -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')();
......@@ -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;
......
......@@ -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');
......
......@@ -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.
先完成此消息的编辑!
想要评论请 注册