vertilia / response
用于抽象服务器响应的库(CLI和/或HTTP)
Requires
- php: >=7.4
- ext-json: *
- vertilia/valid-array: ^1
Requires (Dev)
- phpunit/phpunit: ^9
README
这是一个简单的库,用于抽象多种流行格式的响应数据,并提供基于php-filter扩展的输出模式验证功能。
使用ValidArray机制确保输出与预定义的响应模式相匹配。
用例
您的控制器是一个具有预定义过滤器的HttpResponse对象。过滤器配置对应于特定路由的响应模式,并定义在response元素下的路由文件叶子数据中。
在预渲染阶段,控制器设置response中定义的相应元素。此时,验证机制评估值并在必要时对其进行清理,以符合过滤规则。
不在过滤器列表中的项将被丢弃。无效值被设置为false。正确值按原样设置。存在于验证模式但未设置的项取null值。可以通过php-filter标志常量和ValidArray增强功能修改规则,包括所有过滤器(而不仅仅是FILTER_VALIDATE_*过滤器)的默认值。
在以下示例中,请求控制器UserGetEmail在路由文件中定义为GET /api/users/{id}/email路由的处理程序。在创建时,它接收验证过滤器和包含请求信息的HttpRequest对象。当在控制器上调用render()方法时,它使用JsonResponse渲染HTTP响应文本,并包含相应的头信息。这项工作由JsonResponse完成。控制器本身处理的是位于preRender()方法中的内容。它填充控制器元素id(来自请求)和email(来自User对象)。这些预验证的元素将对应于初始响应模式,并以JSON格式输出(例如:{"id":42,"email":"user@example.com"})。
<?php // etc/api-routes.php return [ 'GET /api/users/{id}/email' => [ 'controller' => App\Controller\UserGetEmail::class, 'filters' => [ 'id' => ['filter' => FILTER_VALIDATE_INT, 'flags' => FILTER_REQUIRE_SCALAR], ], 'response' => [ 'id' => FILTER_VALIDATE_INT, 'email' => FILTER_VALIDATE_EMAIL, ], ] ];
<?php // web/index.php use Vertilia\Request\HttpRequest; use Vertilia\Response\JsonResponse; use Vertilia\Router\HttpRouter; // initialize request object $request = new HttpRequest( $_SERVER, $_GET, $_POST, $_COOKIE, $_FILES, file_get_contents('php://stdin') ); // initialise HttpRouter with request and a list of routes $router = new HttpRouter($request, ['../etc/api-routes.php']); // get leaf structure from router, inject filters and parameters into $request // elements to be present in leaf structure: // - "container" to identify controller name // - "filters" to validate request parameters filters // - "response" filters for response structure $leaf_structure = $router->getControllerFromRequest(App\NotFoundResponse::class); // get HttpResponse object and render it $response = new ($leaf_structure['controller'])($leaf_structure['response'] ?? [], $request); $response->render();
<?php // app/Controller/UserGetEmail.php namespace App\Controller; use Vertilia\Request\HttpRequest; use Vertilia\Response\JsonResponse; class UserGetEmail extends JsonResponse { protected $request; public function __construct(array $filters, HttpRequest $request) { parent::__construct($filters); $this->request = $request; } public function preRender() { $this['id'] = $this->request['id']; $user = new App\Model\User($this['id']); $this['email'] = $user->getEmail(); } }
由于JsonResponse对象是按操作生成的,因此它恰好包含此特定操作所需的过滤器。填充和返回此响应对象可确保渲染的版本与响应模式相匹配。
扩展基本用例
由于初步检查所需请求参数通常与错误消息相关联,因此我们将其留给了用户。如果您想实现本地化文本消息,请查看GitHub上的vertilia/text包。
有关HttpRequest和HttpRouter服务的正确实例化和更多用例,请查看相应的包,请参阅vertilia/request和vertilia/router页面。
更复杂的控制器实现,处理请求验证错误和每个路由定义的多个响应(如OpenAPI规范中定义),可以在vertilia/controller包中找到。