open-solid / open-api-bundle
Provides a tight integration of OpenApi into the Symfony full-stack framework
Package info
github.com/open-solid/open-api-bundle
Type:symfony-bundle
pkg:composer/open-solid/open-api-bundle
v0.4.0
2026-10-06 14:20 UTC
Requires
- php: >=8.2
- symfony/expression-language: ^7.4|^8.0
- symfony/framework-bundle: ^7.4|^8.0
- symfony/property-access: ^7.4|^8.0
- symfony/serializer: ^7.4|^8.0
- symfony/type-info: ^7.4|^8.0
- symfony/validator: ^7.4|^8.0
- zircote/swagger-php: ^6.12
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.54
- phpunit/phpunit: ^11.5|^12.5|^13.0
- roave/security-advisories: dev-latest
- symfony/browser-kit: ^7.4|^8.0
- symfony/intl: ^7.4|^8.0
Suggests
- symfony/intl: To validate the "currency" and "locale" formats
Provides
None
Conflicts
None
Replaces
None
README
Provides a tight integration of the famous zircote/swagger-php library into the Symfony full-stack framework for generating
OpenAPI spec and building Restful APIs quickly.
This bundle is especially created for API-First development.
Installation
composer require open-solid/open-api-bundle
Import the bundle's routes in config/routes.yaml to show the Swagger API documentation:
openapi: resource: '@OpenApiBundle/config/routes.php'
Basic Sample
Define your OpenAPI spec and endpoint at the same time:
<?php namespace Api\Catalog\Controller\Post; use Api\Catalog\Model\Product; use OpenSolid\OpenApiBundle\Attribute\Payload; use OpenSolid\OpenApiBundle\Routing\Attribute\Post; class PostProductAction { #[Post('/products')] public function __invoke(#[Payload] PostProductPayload $payload): Product { return new Product($payload->name, $payload->price); } }
Main Features
- Generate OpenAPI spec from PHP attributes (based on
zircote/swagger-phpv6)- Automatic
Operation,SchemaandPropertyguessing from PHP classes and methods
- Automatic
- Expose Swagger UI to explore the OpenAPI spec and test API endpoints
- Export OpenAPI spec in JSON or YAML format (via HTTP and console command)
- Import OpenAPI spec in JSON or YAML format (via config file)
- Define Symfony routes and OpenAPI Paths using the same attributes:
#[Get],#[Post],#[Put],#[Patch],#[Delete],#[Head],#[Options]- One controller class can declare many of them
- Conditional OpenAPI Path/Route definition:
- Example:
#[Get('/me', when: 'service("toggle_me").isEnabled()')]
- Example:
- Native Symfony mapping attributes:
#[MapRequestPayload](includingtype: Item::classfor arrays) becomes the request body#[MapQueryString](includingkey: 'filter') and#[MapQueryParameter]become query parameters
- Symfony attributes abbreviations:
#[Payload]instead of#[MapRequestPayload]#[Query]instead of#[MapQueryString]
- OpenAPI attributes abbreviations:
#[Path]instead of#[PathParameter]#[Param]instead of#[QueryParameter]
- Query and path parameter inference from PHP reflection:
type,format,items,enum,default,requiredand the arraystyledescriptionfrom the property or method docblock
- Schema inference from PHP reflection:
requiredfrom nullability, default values and theNotNull/NotBlankconstraintstypeandenumfrom backed and pure PHP enumsdefaultfrom promoted constructor parameters
- Symfony Validator constraints describe the spec:
Length,Count,Range, comparisons,Regex,Choice,All, formats (Uuid,Email,Url, ...) and more
- OpenAPI attributes define Symfony Validator constraints:
- Example:
#[Property(minLength: 3, maxLength: 255)]
- Example:
- Response inference from the controller return type:
- Item types of arrays from
@return list<View>(or theitemsTypeoption) - Declared
responsesare merged with the inferred success response 401and403responses for operations withsecurity- Custom success status code with
statusCode: 202, for the spec and the response
- Item types of arrays from
- Automatic controller response serialization (JSON format by default)
- Generate new endpoints from API spec (WIP) (based on
open-solid/open-api-assistant-bundle)
Upgrade to swagger-php v6
- The bundle requires
zircote/swagger-php^6.12 andsymfony/type-info. - Docblock annotations (
@OA\...) are not read anymore. Use PHP attributes. - Custom processors implement
OpenSolid\OpenApiBundle\OpenApi\Processor\ProcessorInterface. They are taggedopenapi.processorautomatically. TheOpenApi\Processors\ProcessorInterfaceof swagger-php does not exist anymore. - The
formatandenumoptions of#[Path]now go into the parameterschema. - Object schemas now declare their
requiredproperties. - Query parameters now declare their
schema, with thedefaultvalue instead of anexample. - An empty array result now returns
200with[], not204.
License
This software is published under the MIT License