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

1.0.2 2023-06-27 17:26 UTC

This package is auto-updated.

Last update: 2024-05-27 19:17:05 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);
    }
}