pln0w / rest-api-validator
此包已被废弃且不再维护。没有推荐替代包。
用于创建用于预控制器验证的请求对象的包
1.0.0
2019-12-18 15:28 UTC
Requires
- php: ^7.4
- symfony/dependency-injection: 5.0.*
- symfony/http-foundation: 5.0.*
- symfony/http-kernel: 5.0.*
- symfony/validator: 5.0.*
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 }