mkoprek/request-validation-bundle

3.0.1 2023-05-24 11:56 UTC

README

Build Status codecov

这是一个用于简化请求处理的简单库。您可以使用它轻松定义传入的负载和验证规则。您还可以将传入的数据简单地转换为例如整数值。

安装

composer require mkoprek/request-validation-bundle

用法

您需要创建一个扩展 AbstractRequest 的类,然后

  • 创建您想从请求中获取的字段作为类属性
  • 将验证规则作为 Symfony 约束添加到 getValidationRules() 方法
  • 将变量添加到其他类型或对象(例如 Uuid)

请求

<?php
declare(strict_types=1);

use MKoprek\RequestValidation\Request\AbstractRequest;
use Symfony\Component\Uid\Uuid;
use Symfony\Component\Validator\Constraints as Assert;

class UserCreateRequest extends AbstractRequest
{
    protected string $id;
    protected ?string $name;

    public function getId(): Uuid
    {
        return Uuid::fromString($this->id);
    }
    
    public function getName(): ?string
    {
        return $this->name;
    }

    /**
     * @return array<Assert\Collection>
     */
    public function getValidationRules(): array
    {
        return [
            new Assert\Collection([
                'id' => new Assert\Required([
                    new Assert\NotNull(),
                    new Assert\NotBlank(),
                    new Assert\Uuid(),
                ]),
                'name' => new Assert\Required([
                    new Assert\NotNull(),
                    new Assert\NotBlank(),
                    new Assert\Type('string'),
                ]),
            ]),
        ];
    }
}

控制器

<?php
declare(strict_types=1);

use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

#[Route('/api')]
class UserCreateController
{
    #[Route('/users', name: 'users.create', methods: 'POST')]
    public function post(UserCreateRequest $request): JsonResponse
    {
        $id = $request->getId();
        $name = $request->getName();

        $this->commandBus->handle(
            CreateUserCommand($request->getId(), $request->getName())
        );

        return new JsonResponse(['id' => $id->toRfc4122()], Response::HTTP_CREATED);
    }
}

验证

验证在控制器解析请求之前自动进行。如果有任何验证错误,将抛出 ApiValidationException。如果您想返回带有错误的 JSON,只需将以下内容添加到您的 services.yaml 中。它将处理所有异常。

  MKoprek\RequestValidation\Response\ResponseSubscriber:
    tags:
      - { name: kernel.event_subscriber, event: kernel.exception }

带有验证错误的示例响应

{
    "status": 422,
    "message": "Request validation error",
    "details": [
        {
            "field": "[id]",
            "error": "This field is missing."
        },
        {
            "field": "[name]",
            "error": "This field is missing."
        },
        {
            "field": "[name2]",
            "error": "This field was not expected."
        }
    ]

带有其他异常的示例

{
"status": 500,
"message": "Attempted to call an undefined method named 'notExists' of class 'UserCreateRequest'."
}

许可证

MIT

作者信息

由 Maciej Koprek (mkoprek) 创建于 2021 年