n1215 / http-context
处理PSR-7 HTTP消息的附加接口。
v0.1.0
2016-04-02 05:27 UTC
Requires
- php: >=7.0.0
- psr/http-message: ^1.0
This package is auto-updated.
Last update: 2024-09-11 20:21:27 UTC
README
为PSR-7 HTTP消息提供附加接口。使PSR-7 HTTP中间件(或应用程序)更简单、更可组合。
HttpContext
HttpContext包含PSR-7 HTTP请求、HTTP响应和状态。
interface HttpContextInterface { public function getRequest() : ServerRequestInterface; public function getResponse() : ResponseInterface; public function isTerminated(): bool; public function withRequest(ServerRequestInterface $request): HttpContextInterface; public function withResponse(ResponseInterface $response): HttpContextInterface; public function withIsTerminated(bool $isTerminated): HttpContextInterface; public function handledBy(HttpHandlerInterface $handler): HttpContextInterface; }
HttpHandler
处理HttpContext。这是典型MVC Web框架中HTTP中间件、HTTP应用程序或控制器操作的抽象。
interface HttpHandlerInterface { public function __invoke(HttpContextInterface $context) : HttpContextInterface; }
与流行PSR-7中间件的比较
- 无可调用链
- 自然组合管道
示例
use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ResponseInterface; use N1215\Http\Context\HttpContextInterface; use N1215\Http\Context\HttpHandlerInterface; class HttpHandler implements HttpHandlerInterface { public function __invoke(HttpContextInterface $context): HttpContextInterface { //do stuff $context->getResponse()->getBody()->write('Hello, world!'); return $context; } } /** * @var ServerRequestInterface $request */ $request = ServerRequestFactory::fromGlobals(); /** * @var ResponseInterface $response */ $response = new Response(); $context = new HttpContext($request, $response); // implements HttpContextInterface $handler = new HttpHandler(); $newContext = $handler->__invoke($context); // or $handler($context); $newResponse = $newContext->getResponse();
顺序上下文处理
$context = new HttpContext($request, $response); $first = new FirstHttpHandler(); // implements HttpHandlerInterface $second = new SecondHttpHandler(); // implements HttpHandlerInterface $newContext = $second($first($context));
顺序上下文处理(方法链)
$context = new HttpContext($request, $response); $newContext = $context ->handledBy(new FirstHttpHandler()); ->handledBy(new SecondHttpHandler());
将处理器管道作为HttpHandler组合
class HandlerPipeline implements HttpHandlerInterface { /** * @var HttpHandlerInterface[] */ private $handlers = []; public function __construct(array $handlers = []) { $this->handlers = $handlers; } public function __invoke(HttpContextInterface $context) : HttpContextInterface { foreach($this->handlers as $handler) { if($context->isTerminated()) { return $context; } $context = $handler->__invoke($context); } return $context; } } $context = new HttpContext($request, $response); $pipeline = new HandlerPipeline([ new FirstHttpHandler(), new SecondHttpHandler(), ]); $newContext = $pipeline($context);
许可
MIT许可。