gchernikov / request-resolver-bundle
用于构建请求DTO(数据传输对象)并将其解析为控制器参数的Symfony扩展包
1.0.2
2023-06-27 17:26 UTC
Requires
- php: >=8.1
- symfony/framework-bundle: ^6.2
- symfony/serializer: ^6.2
- symfony/validator: ^6.2
- zircote/swagger-php: ^4.5
Requires (Dev)
- roave/security-advisories: dev-latest
This package is auto-updated.
Last update: 2024-09-04 09:15:31 UTC
README
基于Openapi属性的请求DTO解析的Symfony扩展包
安装
使用composer安装此包
composer require gchernikov/request-resolver-bundle
用法
示例1. 仅从GET参数中填充请求DTO
请求DTO类
#[AsResolvableRequest] class GetAllOrderRequest { #[Date] public ?string $dateFrom = null; #[Date] #[GreaterThanOrEqual(propertyPath: 'dateFrom')] public ?string $dateTo = null; }
控制器类
#[Route( path: '/order', name: 'order:get_all', methods: [Request::METHOD_GET], )] #[OA\Tag('Order')] #[OA\Get( operationId: 'order:get_all', description: 'List of all user\'s orders with filtering', summary: 'Orders history', parameters: [ new OA\Parameter( name: 'dateFrom', description: 'Period date from', in: 'query', schema: new OA\Schema(type: 'date', nullable: true), ), new OA\Parameter( name: 'dateTo', description: 'Period date to', in: 'query', schema: new OA\Schema(type: 'date', nullable: true), ) ], responses: [ new App\Response\Ok(type: GetAllOrderResponse::class), ], )] #[App\Response\ValidationError] #[App\Response\UnexpectedError] class GetAllOrderController extends AbstractController { public function __invoke(GetAllOrderRequest $request): Response { // Demo for showing request Dto dump($request); // Place some logic to handle your request in $this->operation $result = ($this->operation)($request); return $this->json($result); } }
示例2. 从GET参数和POST数据中填充请求DTO
请求DTO类
#[AsResolvableRequest] final class CreateOrderRequest { #[NotBlank] #[GreaterThanOrEqual(1)] public int $quantity; #[NotBlank] public int $productId }
控制器类
#[Route( path: '/product/{productId}/order', name: 'order:create', methods: [Request::METHOD_POST], )] #[OA\Tag('Order')] #[OA\Post( operationId: 'order:create', description: 'Create order for a certain product', summary: 'Creates order', requestBody: new RequestBody( required: true, content: new JsonContent( ref: new Model(type: CreateOrderRequest::class), ), ), parameters: [ new OA\Parameter( name: 'productId', description: 'Id of product', in: 'path', schema: new OA\Schema(type: 'int', nullable: false), example: 123, ), ], responses: [ new Created(type: CreateOrderResponse::class), ], )] class CreateOrderController extends AbstractController { public function __invoke(CreateOrderRequest $request): Response { // Demo for showing request Dto dump($request); // Place some logic to handle your request in $this->operation $result = ($this->operation)($request); return $this->json($result); } }