Installation Add the bundle via Composer:
composer require dokapi/swagger-bundle
Register the bundle in config/bundles.php:
return [
// ...
Dokapi\SwaggerBundle\DokapiSwaggerBundle::class => ['all' => true],
];
Basic Configuration Publish the default config:
php artisan vendor:publish --provider="Dokapi\SwaggerBundle\DokapiSwaggerBundle" --tag="config"
Update config/swagger.php with your API details (e.g., host, base_path).
First Use Case: Documenting a Controller Annotate a controller method with Swagger tags:
use Dokapi\SwaggerBundle\Annotation\Swagger;
class UserController extends Controller
{
/**
* @Swagger\Get(
* path="/users",
* summary="Get all users",
* tags={"Users"}
* )
*/
public function index()
{
return User::all();
}
}
Generate Documentation Run the generator:
php artisan swagger:generate
Output will be saved to public/swagger.json (configurable).
Incremental Documentation
php artisan swagger:generate --only-changed
Reusing Annotations
abstract class ApiController extends Controller
{
/**
* @Swagger\Tag(name="API", description="Base API endpoints")
*/
}
Integration with API Platform If using API Platform, merge annotations:
use ApiPlatform\Metadata\ApiResource;
use Dokapi\SwaggerBundle\Annotation\Swagger;
#[ApiResource]
class User
{
/**
* @Swagger\Get(
* path="/users/{id}",
* summary="Get a user by ID"
* )
*/
}
Dynamic Paths/Parameters Use placeholders for dynamic routes:
/**
* @Swagger\Get(
* path="/users/{id}",
* summary="Get user by ID",
* @Swagger\Parameter(
* name="id",
* in="path",
* type="integer",
* required=true
* )
* )
*/
Security Schemes
Define OAuth2/JWT auth in config/swagger.php:
'securityDefinitions' => [
'Bearer' => [
'type' => 'apiKey',
'name' => 'Authorization',
'in' => 'header',
],
],
Apply to endpoints:
/**
* @Swagger\Get(
* path="/admin/users",
* security={{"Bearer": {}}}
* )
*/
Annotation Parsing Issues
dokapi/swagger-bundle:^1.0 (older syntax).returnTypeWillChange is enabled in php.ini for proper docblock parsing.php artisan cache:clear
Route Conflicts
routes/api.php./**
* @Swagger\Ignore()
*/
Complex Types
config/swagger.php under definitions:
'definitions' => [
'User' => [
'type' => 'object',
'properties' => [
'name' => ['type' => 'string'],
'roles' => ['type' => 'array', 'items' => ['type' => 'string']],
],
],
],
$ref to avoid duplication:
'properties' => [
'users' => ['type' => 'array', 'items' => ['$ref' => '#/definitions/User']],
],
Performance
php artisan swagger:generate --exclude="App\Http\Controllers\Tests*"
Validation Rules ↔ Swagger Sync Laravel validation rules to Swagger schemas:
/**
* @Swagger\Post(
* path="/users",
* @Swagger\Parameter(
* name="body",
* in="body",
* required=true,
* schema={
* "type": "object",
* "properties": {
* "name": {"type": "string", "minLength": 3},
* "email": {"type": "string", "format": "email"}
* }
* }
* )
* )
*/
Custom Templates
Override the default OpenAPI template in resources/views/vendor/swagger/.
Example: Add a custom info section:
{# resources/views/vendor/swagger/info.twig #}
{
"info": {
"title": "{{ config('swagger.title') }}",
"version": "{{ config('swagger.version') }}",
"description": "{{ config('swagger.description') }}",
"contact": {
"email": "{{ config('swagger.contact_email') }}"
}
}
}
Testing Docs Validate generated docs against a schema:
composer require --dev zircote/swagger-php
php artisan swagger:validate
Environment-Specific Docs
Use different configs for dev/prod:
php artisan swagger:generate --env=production
Configure in config/swagger.php:
'env_config' => [
'production' => 'config/swagger_prod.php',
],
IDE Integration
Settings > Languages & Frameworks > REST Client.public/swagger.json.Deprecation Warnings
@Swagger\Deprecated() annotations for future API changes:
/**
* @Swagger\Get(
* path="/legacy/users",
* @Swagger\Deprecated(
* description="Use /users instead"
* )
* )
*/
How can I help you explore Laravel packages today?