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
包中找到。