定制 decodelabs/harvest 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

decodelabs/harvest

Composer 安装命令:

composer require decodelabs/harvest

包简介

PSR-15 HTTP stack without the mess

README 文档

README

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

PSR-15 HTTP stack without the mess

Harvest provides a unified PSR-15 HTTP stack with a simple, expressive API on top of PHP Fibers to avoid common pitfalls of other PSR-15 implementations such as call stack size, memory usage and Middleware traversal.

Installation

This package requires PHP 8.4 or higher.

Install via Composer:

composer require decodelabs/harvest

Usage

Harvest provides the full PSR-15 stack, including Request, Response, Middleware and Handler interfaces. The root of the system is the Dispatcher which takes a Request and a Middleware Profile and returns a Response.

The Profile defines what Middleware is used to process the request and how it is ordered.

use DecodeLabs\Harvest;
use DecodeLabs\Harvest\Dispatcher;
use DecodeLabs\Harvest\Middleware\ContentSecurityPolicy;
use DecodeLabs\Harvest\Profile;
use DecodeLabs\Harvest\Response\Text as TextResponse;
use DecodeLabs\Monarch;

// Create a Middleware Profile
$profile = new Profile(
    '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 new TextResponse('Hello World!');
    }
);

// Create a Dispatcher
$dispatcher = new Dispatcher($profile);
$harvest = Monarch::getService(Harvest::class);

$request = $harvest->createRequestFromEnvironment();
$response = $dispatcher->dispatch($request);

String names passed to a Profile will resolve via Slingshot, allowing for easy dependency injection and container resolution.

Ordering

Middleware is sorted by a dual level priority system, first grouped by the intent of the Middleware, in this order:

  • ErrorHandler - catches and handles errors within the stack
  • Inbound - processes the request before it is passed to the next Middleware
  • Outbound - processes the response before it is sent to the client
  • Generic - generic Middleware that does not fit into the above categories
  • Generator - generates or loads the primary response content

Then each group is sorted by the priority of the Middleware, with lower numbers being higher in the group. Harvest Middleware implement an extension to the Psr Middleware interface, defining defaults for group and priority.

These can be overridden when defining your Profile:

use DecodeLabs\Harvest\Profile;

$profile = new Profile()
    ->add('Cors', priority: 5, group: 'Generic')
    ->add(new SomeOtherVendorMiddleware(), priority: 10, group: 'Inbound');

Fibers

Harvest uses PHP Fibers to flatten the call stack within the dispatch loop - this makes for considerably less noise when debugging and understanding Exception call stacks.

Instead of a call stack that grows by at least 2 frames for every Middleware instance in the queue (which gets unwieldy very quickly), Harvest utilises the flexbility of Fibers to break out of the stack at each call to the next HTTP handler and effectively run each Middleware as if it were in a flat list, but without breaking Exception handling or any of the semantics of stacking the Middleware contexts.

ResponseHandler and Transports

Once a Response has been generated, you can then use an instance of a Harvest ResponseHandler and Transport to prepare and send it to the client.

Harvest currently provides a generic Native Transport implementation that uses PHP's built in header and output stream functions.

use DecodeLabs\Harvest\ResponseHandler;
use DecodeLabs\Harvest\Transport\Native as NativeTransport;

$handler = new ResponseHandler(
    new NativeTransport()
);

$handler->sendResponse(
    $request,
    $response
);

exit;

Responses

Harvest provides easy shortcuts for creating Responses:

use DecodeLabs\Harvest\Response\Text as TextResponse;
use DecodeLabs\Harvest\Response\Html as HtmlResponse;
use DecodeLabs\Harvest\Response\Json as JsonResponse;
use DecodeLabs\Harvest\Response\Xml as XmlResponse;
use DecodeLabs\Harvest\Response\Redirect as RedirectResponse;
use DecodeLabs\Harvest\Response\Stream as StreamResponse;
use DecodeLabs\Harvest\Response\Generator as GeneratorResponse;

$text = new TextResponse('Hello World!'); // Text

$customText = new TextResponse('Hello World!', 201, [
    'Custom-Header' => 'header-value'
]);

$html = new HtmlResponse('<h1>Hello World!</h1>'); // HTML

$json = new JsonResponse([
    'whatever-data' => 'Hello World!'
]); // JSON

$xml = new XmlResponse($xmlString); // XML

$redirect = new RedirectResponse('/some/other/path'); // Redirect

$file = new StreamResponse('/path/to/file'); // Stream

$resource = new StreamResponse(
    $harvest->createStreamFromResource($resource)
); // Stream

$generator = new GeneratorResponse(function() {
    yield 'Custom content';
    yield ' can be written';
    yield ' and streamed';
    yield ' from a generator';
}, 200, [
    'Content-Type' => 'text/plain'
]);

Cookies

Harvest provides a Cookies Middleware and a global Cookie Collection that allows you to define request-level cookies separately from the response generation process and merges them into the response. Just make sure the Cookie Middleware is added to your Profile.

$profile->add('Cookies');

$harvest->cookies->set(
    name: 'cookie-name',
    value: 'cookie-value',
    domain: 'example.com',
    path: '/',
    expires: '10 minutes',
    maxAge: 600,
    httpOnly: true,
    secure: true,
    sameSite: 'Strict',
    partitioned: true
);

$harvest->cookies->expire(
    name: 'cookie-name',
    domain: 'example.com',
    path: '/',
);

Licensing

Harvest is licensed under the MIT License. See LICENSE for the full license text.

decodelabs/harvest 适用场景与选型建议

decodelabs/harvest 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 2.9k 次下载、GitHub Stars 达 0, 最近一次更新时间为 2023 年 10 月 31 日, 在 PHP 生态内属于活跃度较高的组件。

我们在过去多个企业项目中使用过 decodelabs/harvest 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 decodelabs/harvest 我们能提供哪些服务?
定制开发 / 二次开发

基于 decodelabs/harvest 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 2.9k
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 27
  • 依赖项目数: 6
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 2
  • Forks: 1
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2023-10-31