desilva/microserve

创建 PHP 应用服务器时的轻量级 API

v2.0.0 2024-07-14 19:41 UTC

This package is auto-updated.

Last update: 2024-09-14 20:20:19 UTC


README

最小化。无偏见。零依赖。

关于

此包提供创建应用服务器的框架,并旨在用作其他包的起点。将其视为位于低级 PHP 服务器实现和您的高级应用逻辑之间的一层,允许您以您可能习惯的抽象面向对象的方式与请求和响应交互。该名称来自它基于 Pikoserve

安装

使用 Composer 安装包(desilva/microserve

composer require desilva/microserve

用法

请参阅 docs 目录中的示例项目。

该项目还用于 HydePHP 实时编译器(V2.0) 的服务器核心,我建议您也查看那里的实现。

高级概述

您需要自己处理引导,因为每个用例都不同。

通常,您希望将所有请求路由到单个入口点,该入口点应该是 HttpKernelInterface 的扩展。这是您绑定路由器或类似功能以处理请求的地方。

一般实现

实现服务器的推荐方式是将所有 HTTP 请求路由到 server.php 脚本。此脚本应注册 Composer 自动加载器,运行 bootstrap.php 脚本,然后最终创建一个新的 Application 实例来捕获和处理传入的 HTTP 请求。

以下是一个 server.php 脚本的示例

require_once 'vendor/autoload.php';

$app = \Desilva\Microserve\Microserve::boot(\App\Http\MyHttpKernel::class);
$app->handle(); // Process the request to create and send the response

boot() 方法将构建您的内核,然后返回一个包含内核的 Application 实例。

然后我们调用 handle() 方法,该方法将注入一个 Request 对象,然后调用内核的 handle 方法,该方法返回一个用于将 HTTP 响应发送给客户端的 Response 对象。

HttpKernel 示例

class HttpKernel implements HttpKernelInterface
{
    public function handle(Request $request): Response
    {
        return Response::make(200, 'OK', [
            'body' => 'Hello World!',
        ]);
    }
}

注意:应用程序将自动发送内核创建的响应。

v2.0 版本的发行说明

破坏性/重大更改

  • 破坏性:现在 ResponseInterface::send() 方法返回 static 而不是 void。此更改影响了接口及其所有实现类。
  • 重大:Application 类现在自动发送内核返回的响应。

新功能

  • 现在在 Response 类中缓冲了标题,而不是立即发送。
  • 在 Response 类中添加了新的受保护方法 sendHeaders(),用于发送所有缓存的标题。
  • 添加了新的 HtmlResponse 类,用于处理带有适当标题的 HTML 响应。

改进

  • Response::send()JsonResponse::send() 方法现在返回 $this,允许进行方法链式调用,并在处理响应时提供更多灵活性。
  • 现在应用程序自动发送内核返回的响应,无需手动调用 send()。这修复了一个常见的“陷阱”,即用户在创建响应后忘记调用 send()
  • 类型提示现在使用 static 返回而不是 self,以更准确地反映方法的返回类型。
  • 在整个响应生命周期中操作标题的更多灵活性。
  • 与现代 PHP 框架中的常见做法更好地对齐。

升级指南

如果您是从 v1.x 升级到 v2.0,以下是需要您注意的关键变更:

Response::send() 方法返回类型

  1. ResponseInterface 中的 send() 方法现在返回类型为 static。这是一个破坏性变更,因为它要求所有实现类更新其方法签名。

  2. 如果您有任何自定义类实现了 ResponseInterface,您必须更新它们的 send() 方法以返回 static

    public function send(): static
    {
        // Your implementation
    
        return $this;
    }

请检查您的代码库中任何对 ResponseInterface 的实现,并相应地进行更新。这次变更是为了允许方法链式调用,并在处理响应时提供更多灵活性,同时允许以更流畅的方式处理已发送的响应。

响应创建和发送

现在 Application 类负责在内核处理请求后发送响应,这意味着您在创建响应后不再需要手动调用 send()

更新使用示例

// In your HttpKernel or similar class
public function handle(Request $request): Response
{
    return Response::make(200, 'OK', ['body' => 'Hello World!']);
    // OR: return new Response(200, 'OK', ['body' => 'Hello World!']);
}

// In your application entry point
$app = new Application(new MyHttpKernel());
$app->handle(); // This will now send the response

请检查您的代码库中任何手动发送响应的情况,因为创建响应后不再需要调用 send()。应用程序将自动发送内核返回的响应。

发送头部的变更

  1. 现在 withHeaders() 方法将头部添加到缓冲区而不是立即发送。如果您依赖于立即发送头部,可能需要调整您的代码。
  2. 当在 Response 对象上调用 send() 方法时,现在会发送头部。确保您在应用程序生命周期中适当的时候调用 send()
  3. 如果您扩展了 Response 或 JsonResponse 类,可能需要更新您的实现以与新的缓冲头部方法兼容。
  4. 更新任何检查立即发送头部的测试。您可能需要使用反射或模拟头部函数来测试新的缓冲行为。

新的 HtmlResponse 类

已添加新的 HtmlResponse 类来处理 HTML 响应。这个类会自动设置适当的 Content-Type 和 Content-Length 头部以用于 HTML 内容。如果您返回 HTML 响应,考虑使用这个新的类。

use Desilva\Microserve\HtmlResponse;

// In your HttpKernel or similar class
public function handle(Request $request): Response
{
    return new HtmlResponse(200, 'OK', ['body' => '<html><body>Hello World!</body></html>']);
}

结论

如果在升级过程中遇到任何问题,请在 GitHub 仓库中提交一个问题。