gchernikov / request-resolver-bundle
Symfony bundle for constructing request dto's and resolving them as Controller arguments
Installs: 4 958
Dependents: 0
Suggesters: 0
Security: 0
Stars: 1
Watchers: 1
Forks: 0
Open Issues: 2
Type:symfony-bundle
pkg:composer/gchernikov/request-resolver-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
This package is auto-updated.
Last update: 2025-12-04 12:33:06 UTC
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);
}
}