desilva / microserve
创建 PHP 应用服务器时的轻量级 API
Requires
- php: ^8.0
Requires (Dev)
- phpunit/phpunit: ^10.0
- symfony/var-dumper: ^6.4
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() 方法返回类型
-
在
ResponseInterface
中的send()
方法现在返回类型为static
。这是一个破坏性变更,因为它要求所有实现类更新其方法签名。 -
如果您有任何自定义类实现了
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()
。应用程序将自动发送内核返回的响应。
发送头部的变更
- 现在
withHeaders()
方法将头部添加到缓冲区而不是立即发送。如果您依赖于立即发送头部,可能需要调整您的代码。 - 当在 Response 对象上调用
send()
方法时,现在会发送头部。确保您在应用程序生命周期中适当的时候调用send()
。 - 如果您扩展了 Response 或 JsonResponse 类,可能需要更新您的实现以与新的缓冲头部方法兼容。
- 更新任何检查立即发送头部的测试。您可能需要使用反射或模拟头部函数来测试新的缓冲行为。
新的 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 仓库中提交一个问题。