vertilia/response

用于抽象服务器响应的库(CLI和/或HTTP)

v1.1.1 2023-06-25 14:11 UTC

This package is auto-updated.

Last update: 2024-08-25 16:41:28 UTC


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包。

有关HttpRequestHttpRouter服务的正确实例化和更多用例,请查看相应的包,请参阅vertilia/requestvertilia/router页面。

更复杂的控制器实现,处理请求验证错误和每个路由定义的多个响应(如OpenAPI规范中定义),可以在vertilia/controller包中找到。