decodelabs / harvest
没有混乱的PSR-15 HTTP堆栈
v0.3.0
2024-08-22 02:36 UTC
Requires
- php: ^8.1
- decodelabs/archetype: ^0.3
- decodelabs/coercion: ^0.2.7
- decodelabs/collections: ^0.9
- decodelabs/compass: ^0.2
- decodelabs/deliverance: ^0.2.11
- decodelabs/exceptional: ^0.4.4
- decodelabs/glitch-support: ^0.4.4
- decodelabs/singularity: ^0.2.2
- decodelabs/slingshot: ^0.1.1
- decodelabs/veneer: ^0.11.6
- psr/container: ^2.0
- psr/http-factory: ^1.0
- psr/http-message: ^2.0
- psr/http-server-handler: ^1.0
- psr/http-server-middleware: ^1.0
Requires (Dev)
- decodelabs/atlas: ^0.12
- decodelabs/genesis: ^0.9
- decodelabs/pandora: ^0.2.11
- decodelabs/phpstan-decodelabs: ^0.6.7
- decodelabs/sanctum: ^0.2
Suggests
- decodelabs/sanctum: Content security policy support
This package is auto-updated.
Last update: 2024-09-04 21:17:06 UTC
README
没有混乱的PSR-15 HTTP堆栈
Harvest 提供了一个统一的 PSR-15 HTTP 堆栈,它基于 PHP Fibers 并具有简单、表达性强的 API,以避免其他 PSR-15 实现中常见的陷阱,如调用栈大小、内存使用和中间件遍历。
在 DecodeLabs 博客 上获取新闻和更新。
安装
通过 Composer 安装
composer require decodelabs/harvest
用法
Harvest 提供了完整的 PSR-15 堆栈,包括请求、响应、中间件和处理程序接口。
use DecodeLabs\Harvest; use DecodeLabs\Harvest\Dispatcher; use DecodeLabs\Harvest\Middleware\ContentSecurityPolicy; // Create a Dispatcher $dispatcher = new Dispatcher( $myPsrContainer // Ideally initialize with a PSR-11 container ); // Add middleware $dispatcher->add( 'ErrorHandler', // Resolve by name via container / Archetype new ContentSecurityPolicy(), // Add middleware instance function($request, $handler) { // Add middleware callback // $handler is the next middleware in the stack // $request is the current request // Return a response return Harvest::text('Hello World!'); } ); $request = Harvest::createRequestFromEnvironment(); $response = $dispatcher->dispatch($request);
传递给分发器的字符串名称将通过可选的 PSR 容器解析,然后是 Archetype,它为 DecodeLabs\Harvest\Middleware
提供默认映射,但可以轻松扩展
use DecodeLabs\Archetype; use DecodeLabs\Harvest\Middleware; Archetype::map(Middleware::class, MyMiddlewareNamespace::class);
Fibers
Harvest 使用 PHP Fibers 来 扁平化 分发循环中的调用栈,这使调试和理解异常调用栈时的噪音大大减少。
与队列中的每个中间件实例至少增加 2 个框架的调用栈(这很快就变得有问题),Harvest 利用 Fibers 的灵活性在每个调用下一个 HTTP 处理程序时跳出堆栈,并且有效地将每个中间件作为扁平列表中的项目运行,而不破坏异常处理或任何中间件堆叠的语义。
传输
一旦生成响应,您就可以使用 Harvest Transport
实例的一个实例将其发送到客户端。
Harvest 目前提供了一个通用的传输实现,该实现使用 PHP 内置的标题和输出流函数。
use DecodeLabs\Harvest; $transport = Harvest::createTransport( // $name - a null name will default to the Generic transport ); $transport->sendResponse( $request, $response ); exit;
响应
Harvest 提供了创建响应实例的简单快捷方式
use DecodeLabs\Harvest; $text = Harvest::text('Hello World!'); // Text $customText = Harvest::text('Hello World!', 201, [ 'Custom-Header' => 'header-value' ]); $html = Harvest::html('<h1>Hello World!</h1>'); // HTML $json = Harvest::json([ 'whatever-data' => 'Hello World!' ]); // JSON $xml = Harvest::xml($xmlString); // XML $redirect = Harvest::redirect('/some/other/path'); // Redirect $file = Harvest::stream('/path/to/file'); // Stream $resource = Harvest::stream(Harvest::createStreamFromResource($resource)); // Stream $generator = Harvest::generator(function() { yield 'Custom content'; yield ' can be written'; yield ' from a generator'; }, 200, [ 'Content-Type' => 'text/plain' ]);
许可
Harvest 在 MIT 许可证下发布。有关完整的许可证文本,请参阅 LICENSE。