pln0w/rest-api-validator

此包已被废弃且不再维护。没有推荐替代包。

用于创建用于预控制器验证的请求对象的包

1.0.0 2019-12-18 15:28 UTC

This package is auto-updated.

Last update: 2022-08-18 21:40:51 UTC


README

一个简单的库,用于强制并使开发REST API控制器保持一致。它允许定义有效负载的结构和验证约束。它还提供了从控制器主体内访问验证数据的更简单的方法。

安装

composer require pln0w/rest-api-validator

将以下部分添加到您的 services.yml

Pawly\RestApiValidator\Resolver\CustomRequestResolver:
    arguments:
      - '@validator'
    tags:
      - { name: controller.request_value_resolver }

每个请求对象都必须注入 request_stack 服务,即

User\Infrastructure\Request\RegisterUserRequest:
        arguments:
            - '@request_stack'

使用方法

  • 为您的控制器提供验证的步骤

    • 创建一个自定义请求,覆盖 Pawly\RestApiValidator\Request\AbstractCustomRequest
    • 定义您想与请求值映射的请求类属性
    • 将验证约束添加到 $metadata(无yaml,无注解 - 纯PHP配置)
    • (可选)覆盖属性所需或针对getter添加显式约束
      参见验证文档: https://symfony.com.cn/doc/master/validation.html

    示例 1.

    <?php
    declare(strict_types=1);
    
    namespace User\Infrastructure\Request;
    
    use Pawly\RestApiValidator\Request\AbstractCustomRequest;
    use Symfony\Component\Validator\Constraints as Assert;
    
    class RegisterUserRequest extends AbstractCustomRequest
    {
        protected ?string $email = null;
        protected ?string $password = null;
    
        /**
         * @inheritDoc
         */
        public function getValidationRules()
        {
            return new Assert\Collection([
                'email' => new Assert\Email(),
                'password' => [
                    new Assert\NotBlank(),
                    new Assert\Length(['min' => 6])
                ]
            ]);
        }
    }
    • 创建一个注入此请求的控制器
    <?php
    declare(strict_types=1);
    
    namespace User\Infrastructure\Controller;
    
    use Pawly\RestApiValidator\Response\ApiResponse;
    use User\Infrastructure\Request\RegisterUserRequest;
    
    final class RegisterUserAction
    {
        public function __invoke(RegisterUserRequest $request): ApiResponse
        {
            // do some stuff ...
            $email = $request->getEmail();
            
            return ApiResponse::json(['email' => $email], ApiResponse::HTTP_OK);
        }
    }

    不同的自定义请求验证示例

    <?php
    declare(strict_types=1);
    
    namespace User\Infrastructure\Request;
    
    use Pawly\RestApiValidator\Request\AbstractCustomRequest;
    use Symfony\Component\Validator\Constraints as Assert;
    use Shared\Domain\ValueObject\Email;
    
    class RegisterUserRequest extends AbstractCustomRequest
    {
        protected ?string $email = null;
        protected ?string $password = null;
    
        /**
         * @inheritDoc
         */
        public function getValidationRules()
        {
            return new Assert\Collection([
                'email' => new Assert\Email(),
                'password' => [
                    new Assert\NotBlank(),
                    new Assert\Length(['min' => 6])
                ]
            ]);
        }
      
        public function getEmail(): Email
        {
             return new Email($this->email);
        }
    }
  • 处理验证错误

如果请求包含无效数据,则抛出异常,并在订阅者中处理,该订阅者将提供以下消息结构

{
    "status": 422,
    "message": "Request validation error",
    "details": {
        "email": "This value should not be correct email address.",
        "password": "This value should not be blank."
    }
}

更多

验证响应接口

如果您想确保控制器使用统一响应,可以通过向您的 services.yaml 添加以下定义来启用对响应接口的检查

Pawly\RestApiValidator\Subscriber\ValidateResponseInterfaceSubscriber:
    tags:
      - { name: kernel.event_subscriber, event: kernel.response }