Installation:
composer require nelmio/api-doc-bundle
Add to config/bundles.php:
Nelmio\ApiDocBundle\NelmioApiDocBundle::class => ['all' => true],
Enable in config/packages/nelmio_api_doc.yaml:
nelmio_api_doc:
documentation:
info:
title: 'My API'
description: 'API Documentation'
version: '1.0.0'
First Use Case:
Annotate a controller method with @ApiDoc:
use Nelmio\ApiDocBundle\Annotation\ApiDoc;
class UserController extends AbstractController
{
/**
* @ApiDoc(
* resource=true,
* description="Get a user by ID",
* requirements={
* {"name"="id", "dataType"="integer", "requirement"="\d+"}
* },
* statusCodes={
* 200="Returned when successful",
* 404="Returned when the user is not found"
* }
* )
*/
public function getUser(int $id): JsonResponse
{
// ...
}
}
Access docs at /api/doc.
Annotation-Based Documentation:
Use @ApiDoc, @ApiFilter, @ApiProperty, and @ApiParam on controllers, entities, and DTOs.
Example for filtering:
/**
* @ApiFilter(
* filterClass=Nelmio\ApiDocBundle\Annotation\Filter\SearchFilter::class,
* properties={
* "name"="name",
* "email"="email"
* }
* )
*/
public function searchUsers(): JsonResponse
Swagger/OpenAPI Integration: Leverage OpenAPI annotations for richer docs:
/**
* @OA\Get(
* path="/users/{id}",
* summary="Get user details",
* @OA\Parameter(
* name="id",
* in="path",
* required=true,
* @OA\Schema(type="integer")
* ),
* @OA\Response(
* response=200,
* description="User details",
* @OA\JsonContent(ref="#/components/schemas/User")
* )
* )
*/
Dynamic Documentation:
Use NelmioApiDocBundle\EventListener\DocumentationListener to inject docs programmatically:
$this->get('nelmio_api_doc.documentation')->addResource(
new Resource('GET', '/dynamic-endpoint', 'Dynamic Endpoint')
);
Authentication & Security: Define security schemes in config:
nelmio_api_doc:
areas:
path_patterns:
- ^/api(?!/doc)
securityDefinitions:
Bearer:
type: apiKey
name: Authorization
in: header
Custom Schemas: Define reusable schemas in YAML:
nelmio_api_doc:
models:
User:
type: object
properties:
id: { type: integer }
name: { type: string }
symfony/flex recipes for seamless setup.api-platform/core for hybrid docs.Nelmio\ApiDocBundle\Tests\Fixtures.nelmio/api-doc-bundle:validate.Annotation Conflicts:
@ApiDoc and @OA\* annotations may conflict.nelmio_api_doc.openapi.enabled: true in config.Caching Headaches:
php bin/console cache:clear) or disable caching in config:
nelmio_api_doc:
documentation:
cache: false
Route Overrides:
NelmioApiDocBundle listener:
// config/routes.yaml
api_doc:
resource: "@NelmioApiDocBundle/Resources/config/routing.yaml"
prefix: /api/doc
Deprecated Annotations:
@ApiParam) may not work in v5+.CORS Misconfigurations:
/api/doc in your frontend or backend.Enable Verbose Logging:
nelmio_api_doc:
documentation:
debug: true
Logs appear in var/log/dev.log.
Validate OpenAPI:
Use the validate command:
php bin/console nelmio:api-doc:validate
Inspect Resources: Dump loaded resources in a controller:
$resources = $this->get('nelmio_api_doc.documentation')->getResources();
dd($resources);
Custom Event Listeners: Extend documentation generation via events:
// src/EventListener/CustomDocListener.php
class CustomDocListener implements EventSubscriber
{
public static function getSubscribedEvents()
{
return [
NelmioApiDocBundle\Event\DocumentationEvent::class => 'onDocumentation',
];
}
public function onDocumentation(DocumentationEvent $event)
{
$event->getDocumentation()->addResource(new Resource('GET', '/custom', 'Custom Endpoint'));
}
}
Override Templates:
Customize the docs UI by overriding Twig templates in templates/bundles/NelmioApiDocBundle/.
Dynamic Schema Generation:
Use Nelmio\ApiDocBundle\Generator\SchemaGeneratorInterface to generate schemas at runtime.
Webpack Encore Integration: Serve static docs via Webpack for SPAs:
// webpack.config.js
Encore.addEntry('api-doc', './vendor/nelmio/api-doc-bundle/Resources/public/js/api-doc.js');
API Versioning: Use sub-bundles or config overrides per version:
# config/packages/dev/nelmio_api_doc_v1.yaml
nelmio_api_doc:
documentation:
info:
title: 'API v1'
version: '1.0.0'
How can I help you explore Laravel packages today?