woss / http
Requires
- php: ^7.3
- ext-json: *
Requires (Dev)
- phpunit/phpunit: ^8
This package is auto-updated.
Last update: 2024-09-09 14:15:31 UTC
README
不,它不是一个PHP框架。
Woss\Http
包是一个类库,旨在简化PHP语言中HTTP协议的处理工作,通过透明和明确地展示应用程序中发生的情况,并允许进行更简单的单元测试。
该包内部包含三个 命名空间,分别是
Woss\Http\Message
,包含处理HTTP消息的类;Woss\Http\Server
,包含简化应用程序开发的类;Woss\Http\Client
,包含外部请求的类;
安装
最简单的方法是通过Composer进行安装
$ composer install woss/http
应用程序
使用 Woss\Http
构建的应用程序将遵循 中间件 的概念,其中每个应用程序组件之间的责任区分和分离非常清晰。HTTP请求将通过 pipe 架构传播,直到生成HTTP响应。
pipe 架构支持三个基本实体
- 匿名函数
function (Request $request, $next): Response)
; - 实现
handle(Request $request): Response
方法的 handler 类; - 实现
process(Request $request, $next): Response
方法的 middleware 类;
匿名函数
基于匿名函数的实体有两个参数:$request
,表示输入的HTTP请求,和$next
,表示 pipe 中的下一个实体。返回值必须是 Response
实例。
use Woss\Http\Message\{Request, Response}; function (Request $request, $next): Response { log('debug', (string) $request); $response = $next($request); log('debug', (string) $response); return $response; }
处理器类
处理器类通过实现 handle
方法而具有特征,该方法仅接受一个参数 $request
,表示输入的HTTP请求,并生成一个 Response
实例。与匿名函数和中 middleware 不同,处理器类没有能力在 pipe 中传播请求,因此它必须生成一个HTTP响应。因此,处理器类通常出现在 pipe 的末尾。
use Woss\Http\Message\{Request, Response, Stream}; class ListAllUsers { public function __construct($users) { $this->users = $users; } public function handle(Request $request): Response { $users = $this->users->getAll(); $content = json_encode($users); $body = new Stream('php://memory', 'w'); $body->write($content); $response = new Response($body, 200, [ 'Content-Type' => 'application/json', 'Content-Length' => strlen($content), ]); return $response; } }
中间件类
中间件类通过实现 process
方法而具有特征,该方法接受两个参数,$request
,表示输入的HTTP请求,和$next
,表示架构中的下一个实体,返回值始终是 Response
实例。由于具有 $next
参数,中间件类,就像匿名函数一样,有权在 pipe 中传播请求,因此它没有生成HTTP响应的义务。因此,中间件类通常用于修改输入的HTTP请求和/或由其他实体产生的HTTP响应。
use Woss\Http\Message\{Request, Response}; class Cache { public function __construct($cache) { $this->cache = $cache; } public function process(Request $request, $next): Response { // Se houver cache da resposta, retorne-a if ($this->cache->exists($request)) { return $this->cache->get($request); } // Caso contrário, gere a resposta HTTP e a armazene no cache $response = $next($request); $this->cache->create($request, $response); return $response; } }
pipe 架构
pipe 架构是通过 Woss\Http\Server\Pipeline
类实现的,该类实现了 handle(Request $request): Response
方法。所有 pipe 中的实体都由传递给类构造函数的可迭代对象定义。
use Woss\Http\Message\{ServerRequest, Request, Response}; use Woss\Http\Server\Pipeline; $pipe = new Pipeline([ function (Request $request, $next): Response { log('debug', (string) $request); $response = $next($request); log('debug', (string) $response); return $response; }, new Cache($services->get('cache')), new ListAllUsers($services->get('users')) ]); $request = ServerRequest::fromGlobals(); $response = $pipe->handle($request); echo (string) $response;