gchernikov / request-resolver-bundle
Symfony bundle for constructing request dto's and resolving them as Controller arguments
Installs: 1 419
Dependents: 0
Suggesters: 0
Security: 0
Stars: 1
Watchers: 1
Forks: 0
Open Issues: 1
Type:symfony-bundle
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
README
Symfony bundle for resolving Request Dto based on Openapi attributes
Installation
Install this package using composer
composer require gchernikov/request-resolver-bundle
Usage
Example 1. Hydrate Request Dto from GET parameters only
Request Dto class:
#[AsResolvableRequest] class GetAllOrderRequest { #[Date] public ?string $dateFrom = null; #[Date] #[GreaterThanOrEqual(propertyPath: 'dateFrom')] public ?string $dateTo = null; }
Controller class:
#[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); } }
Example 2. Hydrate Request Dto from both GET parameters and POST data
Request Dto class:
#[AsResolvableRequest] final class CreateOrderRequest { #[NotBlank] #[GreaterThanOrEqual(1)] public int $quantity; #[NotBlank] public int $productId }
Controller class:
#[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); } }