Installation
composer require draw/swagger
First Use Case: Load and Parse a Swagger File
use Draw\Swagger\Swagger;
$swagger = new Swagger('path/to/swagger.json');
$openApi = $swagger->getOpenApi(); // Returns parsed Swagger/OpenAPI spec
Where to Look First
src/Draw/Swagger/Swagger.php: Core class for loading and manipulating specs.tests/: Example usage patterns for modifying paths, schemas, and responses.README.md: Basic API reference and usage examples.$swagger = new Swagger('api-spec.json');
$openApi = $swagger->getOpenApi();
// Modify a path
$openApi->getPaths()->addPath('/users/{id}', [
'get' => [
'summary' => 'Get user by ID',
'responses' => [
'200' => [
'description' => 'User details',
'schema' => ['$ref' => '#/definitions/User']
]
]
]
]);
$swagger->save('updated-spec.json');
Use annotations or metadata to generate Swagger specs dynamically:
// Example: Extract route metadata to build Swagger paths
Route::get('/users/{id}', function () {
// ...
})->middleware(function ($request, $next) {
$swagger = new Swagger();
$swagger->addPath('/users/{id}', [
'get' => [
'tags' => ['Users'],
'summary' => 'Fetch user by ID',
'parameters' => [
['name' => 'id', 'in' => 'path', 'required' => true, 'type' => 'integer']
]
]
]);
return $next($request);
});
$definitions = $openApi->getDefinitions();
$userSchema = $definitions->getSchema('User');
// Add a new property to the User schema
$userSchema->addProperty('lastLogin', [
'type' => 'string',
'format' => 'date-time'
]);
// Update a response
$responses = $openApi->getPath('/users')->getGet()->getResponses();
$responses->set('404', [
'description' => 'User not found',
'schema' => ['$ref' => '#/definitions/Error']
]);
Combine specs from microservices or modules:
$mainSpec = new Swagger('main-spec.json');
$moduleSpec = new Swagger('module-spec.json');
$mergedSpec = $mainSpec->getOpenApi();
$mergedSpec->merge($moduleSpec->getOpenApi());
$swagger = new Swagger();
$swagger->setOpenApi($mergedSpec);
$swagger->save('merged-spec.json');
Validate Swagger specs against expected structures in your pipeline:
$swagger = new Swagger('api-spec.json');
$openApi = $swagger->getOpenApi();
// Example: Check if a required path exists
$this->assertTrue($openApi->getPaths()->hasPath('/users'), 'Users endpoint missing');
// Example: Validate response schemas
$this->assertArrayHasKey('200', $openApi->getPath('/users')->getGet()->getResponses()->getKeys());
Register the Swagger class in Laravel’s container for easy access:
// app/Providers/AppServiceProvider.php
public function register()
{
$this->app->singleton(Swagger::class, function () {
return new \Draw\Swagger\Swagger(config('swagger.path'));
});
}
Use middleware to dynamically generate or update Swagger specs:
// app/Http/Middleware/GenerateSwaggerSpec.php
public function handle($request, Closure $next)
{
$swagger = app(Swagger::class);
$swagger->addPath($request->route()->uri(), [
'get' => [
'tags' => [$request->route()->getName()],
'summary' => 'Dynamic endpoint'
]
]);
return $next($request);
}
Create a command to generate or validate specs:
// app/Console/Commands/GenerateSwaggerSpec.php
public function handle()
{
$swagger = new Swagger();
$routes = Route::getRoutes()->getRoutes();
foreach ($routes as $route) {
$swagger->addPath($route->uri(), [
'get' => [
'tags' => [$route->getName()],
'summary' => 'Endpoint: ' . $route->uri()
]
]);
}
$swagger->save(storage_path('app/swagger.json'));
$this->info('Swagger spec generated!');
}
openapi-converter) to migrate specs to OpenAPI 3.x after manipulation.tests/ directory for usage patterns.openapi-tools/validator in CI.composer require openapi-tools/validator
vendor/bin/openapi-validator validate api-spec.json
PHPUnit and PHPStan to catch compatibility issues early.OpenApi object if reused frequently.$cacheKey = 'swagger_spec';
$openApi = Cache::remember($cacheKey, now()->addHours(1), function () {
return (new Swagger('api-spec.json'))->getOpenApi();
});
@SWG\Tag). Laravel’s native attributes (e.g., #[Route]) won’t work without manual mapping.getComponents() to manage shared definitions.Dump the parsed OpenApi object to debug issues:
$openApi = (new Swagger('api-spec.json'))->getOpenApi();
dd($openApi->toArray()); // Convert to array for inspection
Ensure the saved spec is valid JSON:
$swagger = new Swagger();
$swagger->setOpenApi($openApi);
$json = $swagger->saveToString(); // Get JSON as string
json_decode($json); // Check for JSON errors
Some methods may be deprecated or renamed in newer versions (though this package is unmaintained). Refer to the tests/ directory for correct usage.
If a path or schema is missing, initialize it explicitly:
if (!$openApi->getPaths()->hasPath('/users')) {
$openApi->getPaths()->addPath('/users', ['get' => []]);
}
Extend the library to support custom annotations (e.g
How can I help you explore Laravel packages today?