Generate strongly typed PHP 8.2+ models, server contracts, and API clients directly from OpenAPI 3.x specs.
This package is designed for teams that want generated code to feel like hand-written application code: explicit types, predictable method signatures, and minimal runtime magic.
- PHP-native workflow: no npm toolchain required for day-to-day generation
- Lightweight by design: generate plain PHP classes/interfaces you can read and own
- Framework-friendly: Symfony and Laravel server glue, plus multiple client adapters
- Great for contract-first teams: keep OpenAPI as source of truth and regenerate safely
- Typed model generation from
components/schemas(classes, enums, nested objects) - Server contract generation from
pathswith selectable framework target (None,Symfony,Laravel) - Client generation with pluggable HTTP adapters (
Symfony HttpClient,Guzzle,PSR-18) - Optional framework and adapter version flags for version-specific code generation when upstream APIs change
- DTO hydration/serialization helpers (
fromArray()andtoArray()) - Operation filtering by tags, operation IDs, and path patterns
- Extension plugin system for
x-*vendor extensions (for examplex-trim)
- PHP
>=8.2 - Composer
>=2.0
composer require --dev maxbeckers/php-openapi-generatorBecause this package is a Composer plugin, allow it in composer.json:
{
"config": {
"allow-plugins": {
"maxbeckers/php-openapi-generator": true
}
}
}The CLI binary is available at vendor/bin/openapi-gen.
<?php
declare(strict_types=1);
use MaxBeckers\OpenApiGenerator\Config\FrameworkTarget;
use MaxBeckers\OpenApiGenerator\Config\GenerationTarget;
use MaxBeckers\OpenApiGenerator\Config\GeneratorConfig;
use MaxBeckers\OpenApiGenerator\Config\HttpClientAdapter;
$config = new GeneratorConfig();
$config->specFile = 'openapi.yaml';
$config->outputDir = 'generated';
$config->modelNamespace = 'App\\Model';
$config->modelOutputDir = 'Model';
$config->apiNamespace = 'App\\Api';
$config->apiOutputDir = 'Api';
$config->generationTarget = GenerationTarget::Server;
$config->frameworkTarget = FrameworkTarget::None;
// Optional version-aware generation knobs:
// $config->frameworkVersion = '8.0';
// $config->httpClient = HttpClientAdapter::Guzzle;
// $config->httpClientVersion = '7.8';
$config->phpReadonly = true;
$config->generateFromArray = true;
$config->generateToArray = true;
return $config;vendor/bin/openapi-gen$config->generationTarget = GenerationTarget::Server;
$config->frameworkTarget = FrameworkTarget::Symfony; // or FrameworkTarget::LaravelThen:
- Generate code with
vendor/bin/openapi-gen - Implement generated
*ApiInterfacemethods - Keep generated controllers/routes as thin transport glue
$config->generationTarget = GenerationTarget::Client;
$config->httpClient = HttpClientAdapter::SymfonyHttpClient; // or Guzzle / Psr18Then:
- Generate code with
vendor/bin/openapi-gen - Inject
*ApiClientinto your services - Use generated DTOs for request/response mapping
vendor/bin/openapi-gen --target=server --framework=symfony
vendor/bin/openapi-gen --target=server --framework=laravel
vendor/bin/openapi-gen --target=client --http-client=psr18Models are always generated.
FrameworkTarget::None:*ApiInterfaceonly (pure contract)FrameworkTarget::Symfony:*ApiInterface+ generated*ApiControlleractions with#[Route]FrameworkTarget::Laravel:*ApiInterface+ generated*ApiController+*ApiRouteshelper
Optional: set $config->frameworkVersion when server framework major versions require different generated glue.
*ApiClientInterface*ApiClient
Adapters:
HttpClientAdapter::SymfonyHttpClientHttpClientAdapter::GuzzleHttpClientAdapter::Psr18
Optional: set $config->httpClientVersion when adapter major versions require different generated transport code.
- Keep your OpenAPI spec in source control.
- Regenerate code when the spec changes.
- Implement generated server interfaces or inject generated clients.
- Decide as a team whether to commit generated code or regenerate in CI.
examples/petstore-client-symfonyexamples/petstore-server-symfony
- Docs Index
- Getting Started
- Server Quickstart
- Client Quickstart
- Configuration Reference
- Framework Targets (Server)
- Client Generation
- HTTP Client Adapters
- Validation Strategies
- Extension Plugins (
x-*)
composer test
composer csMIT - see LICENSE.
Issues and feedback: github.com/maxbeckers/php-openapi-generator/issues
Built with ❤️ for PHP developers