decodelabs/harvest

没有混乱的PSR-15 HTTP堆栈


README

PHP from Packagist Latest Version Total Downloads GitHub Workflow Status PHPStan License

没有混乱的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