2018-01-04 14:33:02 +01:00
|
|
|
|
NelmioApiDocBundle
|
|
|
|
|
==================
|
2018-01-09 10:31:38 +01:00
|
|
|
|
|
2018-01-04 17:47:47 +01:00
|
|
|
|
The **NelmioApiDocBundle** bundle allows you to generate documentation in the
|
|
|
|
|
OpenAPI (Swagger) format and provides a sandbox to interactively browse the API documentation.
|
|
|
|
|
|
|
|
|
|
What's supported?
|
|
|
|
|
-----------------
|
|
|
|
|
|
2018-01-09 12:58:52 +01:00
|
|
|
|
This bundle supports *Symfony* route requirements, PHP annotations, `Swagger-Php`_ annotations,
|
|
|
|
|
`FOSRestBundle`_ annotations and apps using `Api-Platform`_.
|
|
|
|
|
|
|
|
|
|
.. _`Swagger-Php`: https://github.com/zircote/swagger-php
|
|
|
|
|
.. _`FOSRestBundle`: https://github.com/FriendsOfSymfony/FOSRestBundle
|
|
|
|
|
.. _`Api-Platform`: https://github.com/api-platform/api-platform
|
2018-01-04 17:47:47 +01:00
|
|
|
|
|
2018-05-05 14:49:17 +02:00
|
|
|
|
For models, it supports the `Symfony serializer`_ , the `JMS serializer`_ and the `willdurand/Hateoas`_ library.
|
|
|
|
|
It does also support `Symfony form`_ types.
|
2018-01-04 14:33:02 +01:00
|
|
|
|
|
|
|
|
|
Migrate from 2.x to 3.0
|
|
|
|
|
-----------------------
|
|
|
|
|
|
2018-01-10 14:45:02 +01:00
|
|
|
|
`To migrate from 2.x to 3.0, just follow our guide.`__
|
|
|
|
|
|
|
|
|
|
__ https://github.com/nelmio/NelmioApiDocBundle/blob/master/UPGRADE-3.0.md
|
2018-01-04 14:33:02 +01:00
|
|
|
|
|
|
|
|
|
Installation
|
|
|
|
|
------------
|
2018-01-09 10:31:38 +01:00
|
|
|
|
|
|
|
|
|
Open a command console, enter your project directory and execute the following command to download the latest version of this bundle:
|
2018-01-04 14:33:02 +01:00
|
|
|
|
|
|
|
|
|
.. code-block:: bash
|
|
|
|
|
|
|
|
|
|
$ composer require nelmio/api-doc-bundle
|
|
|
|
|
|
|
|
|
|
.. note::
|
|
|
|
|
|
|
|
|
|
If you're not using Flex, then add the bundle to your kernel::
|
|
|
|
|
|
|
|
|
|
class AppKernel extends Kernel
|
|
|
|
|
{
|
|
|
|
|
public function registerBundles()
|
|
|
|
|
{
|
|
|
|
|
$bundles = [
|
|
|
|
|
// ...
|
|
|
|
|
|
|
|
|
|
new Nelmio\ApiDocBundle\NelmioApiDocBundle(),
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
// ...
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
To browse your documentation with Swagger UI, register the following route:
|
|
|
|
|
|
|
|
|
|
.. code-block:: yaml
|
|
|
|
|
|
|
|
|
|
# app/config/routing.yml
|
|
|
|
|
app.swagger_ui:
|
|
|
|
|
path: /api/doc
|
|
|
|
|
methods: GET
|
|
|
|
|
defaults: { _controller: nelmio_api_doc.controller.swagger_ui }
|
|
|
|
|
|
|
|
|
|
If you also want to expose it in JSON, register this route:
|
|
|
|
|
|
|
|
|
|
.. code-block:: yaml
|
|
|
|
|
|
|
|
|
|
# app/config/routing.yml
|
|
|
|
|
app.swagger:
|
|
|
|
|
path: /api/doc.json
|
|
|
|
|
methods: GET
|
|
|
|
|
defaults: { _controller: nelmio_api_doc.controller.swagger }
|
2018-01-09 10:31:38 +01:00
|
|
|
|
|
2018-01-04 17:47:47 +01:00
|
|
|
|
As you just installed the bundle, you'll likely see routes you don't want in
|
|
|
|
|
your documentation such as `/_profiler/`. To fix this, you can filter the
|
|
|
|
|
routes that are documented by configuring the bundle:
|
|
|
|
|
|
|
|
|
|
.. code-block:: yaml
|
|
|
|
|
|
|
|
|
|
# app/config/config.yml
|
|
|
|
|
nelmio_api_doc:
|
|
|
|
|
areas:
|
|
|
|
|
path_patterns: # an array of regexps
|
|
|
|
|
- ^/api(?!/doc$)
|
2018-03-13 12:40:36 -03:00
|
|
|
|
host_patterns:
|
|
|
|
|
- ^api\.
|
2018-01-04 17:47:47 +01:00
|
|
|
|
|
|
|
|
|
How does this bundle work?
|
2018-01-09 10:31:38 +01:00
|
|
|
|
--------------------------
|
2018-01-04 14:33:02 +01:00
|
|
|
|
|
2018-02-20 09:59:00 +01:00
|
|
|
|
It generates you an OpenAPI documentation from your symfony app thanks to
|
|
|
|
|
**Describers**. One extracts data from SwaggerPHP annotations, one from your
|
2018-01-04 14:33:02 +01:00
|
|
|
|
routes, etc.
|
|
|
|
|
|
|
|
|
|
If you configured the ``app.swagger_ui`` route above, you can browse your
|
|
|
|
|
documentation at `http://example.org/api/doc`.
|
2018-01-09 10:31:38 +01:00
|
|
|
|
|
2018-01-04 17:47:47 +01:00
|
|
|
|
Using the bundle
|
|
|
|
|
----------------
|
2018-01-04 14:33:02 +01:00
|
|
|
|
|
2018-01-09 10:31:38 +01:00
|
|
|
|
You can configure global information in the bundle configuration ``documentation.info`` section (take a look at
|
2018-03-23 15:52:39 +01:00
|
|
|
|
`the OpenAPI 2.0 specification (formerly Swagger)`_ to know the fields
|
2018-01-04 14:33:02 +01:00
|
|
|
|
available):
|
|
|
|
|
|
|
|
|
|
.. code-block:: yaml
|
|
|
|
|
|
|
|
|
|
nelmio_api_doc:
|
|
|
|
|
documentation:
|
2018-03-19 14:44:15 -03:00
|
|
|
|
host: api.example.com
|
|
|
|
|
schemes: [http, https]
|
2018-01-04 14:33:02 +01:00
|
|
|
|
info:
|
|
|
|
|
title: My App
|
|
|
|
|
description: This is an awesome app!
|
|
|
|
|
version: 1.0.0
|
2018-03-19 14:44:15 -03:00
|
|
|
|
securityDefinitions:
|
|
|
|
|
Bearer:
|
|
|
|
|
type: apiKey
|
|
|
|
|
description: 'Value: Bearer {jwt}'
|
|
|
|
|
name: Authorization
|
|
|
|
|
in: header
|
|
|
|
|
security:
|
|
|
|
|
- Bearer: []
|
2018-01-04 14:33:02 +01:00
|
|
|
|
|
2018-03-23 15:52:39 +01:00
|
|
|
|
.. _`the OpenAPI 2.0 specification (formerly Swagger)`: https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md
|
2018-01-09 13:22:28 +01:00
|
|
|
|
|
2018-01-04 17:47:47 +01:00
|
|
|
|
.. note::
|
|
|
|
|
|
|
|
|
|
If you're using Flex, this config is there by default. Don't forget to adapt it to your app!
|
|
|
|
|
|
|
|
|
|
To document your routes, you can use the SwaggerPHP annotations and the
|
|
|
|
|
``Nelmio\ApiDocBundle\Annotation\Model`` annotation in your controllers::
|
2018-01-04 14:33:02 +01:00
|
|
|
|
|
|
|
|
|
namespace AppBundle\Controller;
|
|
|
|
|
|
|
|
|
|
use AppBundle\Entity\User;
|
|
|
|
|
use AppBundle\Entity\Reward;
|
|
|
|
|
use Nelmio\ApiDocBundle\Annotation\Model;
|
2018-03-19 14:44:15 -03:00
|
|
|
|
use Nelmio\ApiDocBundle\Annotation\Security;
|
2018-01-04 14:33:02 +01:00
|
|
|
|
use Swagger\Annotations as SWG;
|
|
|
|
|
use Symfony\Component\Routing\Annotation\Route;
|
|
|
|
|
|
|
|
|
|
class UserController
|
|
|
|
|
{
|
2018-04-04 22:10:42 +02:00
|
|
|
|
/**
|
|
|
|
|
* List the rewards of the specified user.
|
2018-01-09 10:31:38 +01:00
|
|
|
|
*
|
|
|
|
|
* This call takes into account all confirmed awards, but not pending or refused awards.
|
|
|
|
|
*
|
2018-01-04 14:33:02 +01:00
|
|
|
|
* @Route("/api/{user}/rewards", methods={"GET"})
|
|
|
|
|
* @SWG\Response(
|
|
|
|
|
* response=200,
|
|
|
|
|
* description="Returns the rewards of an user",
|
|
|
|
|
* @SWG\Schema(
|
|
|
|
|
* type="array",
|
2018-03-17 14:36:57 +01:00
|
|
|
|
* @SWG\Items(ref=@Model(type=Reward::class, groups={"full"}))
|
2018-01-04 14:33:02 +01:00
|
|
|
|
* )
|
|
|
|
|
* )
|
|
|
|
|
* @SWG\Parameter(
|
|
|
|
|
* name="order",
|
|
|
|
|
* in="query",
|
|
|
|
|
* type="string",
|
|
|
|
|
* description="The field used to order rewards"
|
|
|
|
|
* )
|
|
|
|
|
* @SWG\Tag(name="rewards")
|
2018-03-19 14:44:15 -03:00
|
|
|
|
* @Security(name="Bearer")
|
2018-01-04 14:33:02 +01:00
|
|
|
|
*/
|
|
|
|
|
public function fetchUserRewardsAction(User $user)
|
|
|
|
|
{
|
|
|
|
|
// ...
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2018-01-09 10:31:38 +01:00
|
|
|
|
The normal PHP docblock for the controller method is used for the summary and description.
|
|
|
|
|
|
2018-01-04 14:33:02 +01:00
|
|
|
|
Use models
|
|
|
|
|
----------
|
|
|
|
|
|
|
|
|
|
As shown in the example above, the bundle provides the ``@Model`` annotation.
|
2018-03-17 14:36:57 +01:00
|
|
|
|
Use it instead of a definition reference and the bundle will deduce your model properties.
|
2018-01-09 10:31:38 +01:00
|
|
|
|
|
2018-01-13 13:21:23 +01:00
|
|
|
|
.. note::
|
|
|
|
|
|
|
|
|
|
A model can be a Symfony form type, a Doctrine ORM entity or a general PHP object.
|
|
|
|
|
|
2018-02-20 09:59:00 +01:00
|
|
|
|
This annotation has two options:
|
2018-01-04 17:47:47 +01:00
|
|
|
|
|
|
|
|
|
* ``type`` to specify your model's type::
|
|
|
|
|
|
|
|
|
|
/**
|
2018-01-13 13:21:23 +01:00
|
|
|
|
* @SWG\Response(
|
|
|
|
|
* response=200,
|
|
|
|
|
* @Model(type=User::class)
|
|
|
|
|
* )
|
|
|
|
|
*/
|
2018-01-04 17:47:47 +01:00
|
|
|
|
|
|
|
|
|
* ``groups`` to specify the serialization groups used to (de)serialize your model::
|
|
|
|
|
|
2018-01-13 13:21:23 +01:00
|
|
|
|
/**
|
|
|
|
|
* @SWG\Response(
|
|
|
|
|
* response=200,
|
|
|
|
|
* @Model(type=User::class, groups={"non_sensitive_data"})
|
|
|
|
|
* )
|
|
|
|
|
*/
|
2018-01-09 10:31:38 +01:00
|
|
|
|
|
2018-03-17 14:36:57 +01:00
|
|
|
|
.. tip::
|
|
|
|
|
|
|
|
|
|
When used at the root of ``@SWG\Response`` and ``@SWG\Parameter``, ``@Model`` is automatically nested
|
|
|
|
|
in a ``@SWG\Schema``.
|
|
|
|
|
|
|
|
|
|
To use ``@Model`` directly within a ``@SWG\Schema``, ``@SWG\Items`` or ``@SWG\Property``, you have to use the ``$ref`` field::
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @SWG\Response(
|
|
|
|
|
* @SWG\Schema(ref=@Model(type=User::class))
|
|
|
|
|
* )
|
|
|
|
|
*
|
|
|
|
|
* or
|
|
|
|
|
*
|
|
|
|
|
* @SWG\Response(
|
|
|
|
|
* @SWG\Schema(type="object",
|
2018-05-09 17:10:28 +02:00
|
|
|
|
* @SWG\Property(property="foo", ref=@Model(type=FooClass::class))
|
2018-03-17 14:36:57 +01:00
|
|
|
|
* )
|
|
|
|
|
* )
|
|
|
|
|
*/
|
|
|
|
|
|
2018-02-20 09:59:00 +01:00
|
|
|
|
Symfony Form types
|
|
|
|
|
~~~~~~~~~~~~~~~~~~
|
2018-01-04 14:33:02 +01:00
|
|
|
|
|
2018-02-20 09:59:00 +01:00
|
|
|
|
You can customize the documentation of a form field using the ``documentation`` option::
|
2018-01-09 10:31:38 +01:00
|
|
|
|
|
2018-02-20 09:59:00 +01:00
|
|
|
|
$builder->add('username', TextType::class, [
|
|
|
|
|
'documentation' => [
|
|
|
|
|
'type' => 'string', // would have been automatically detected in this case
|
|
|
|
|
'description' => 'Your username.',
|
|
|
|
|
],
|
|
|
|
|
]);
|
2018-01-04 17:47:47 +01:00
|
|
|
|
|
2018-03-19 14:44:15 -03:00
|
|
|
|
See the `OpenAPI 2.0 specification`__ to see all the available fields of the ``documentation`` option.
|
2018-01-04 17:47:47 +01:00
|
|
|
|
|
2018-02-20 09:59:00 +01:00
|
|
|
|
__ https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#schemaObject
|
2018-01-04 17:47:47 +01:00
|
|
|
|
|
|
|
|
|
|
2018-02-20 09:59:00 +01:00
|
|
|
|
General PHP objects
|
|
|
|
|
~~~~~~~~~~~~~~~~~~~
|
2018-01-04 17:47:47 +01:00
|
|
|
|
|
2018-02-20 09:59:00 +01:00
|
|
|
|
.. tip::
|
2018-01-04 17:47:47 +01:00
|
|
|
|
|
2018-05-05 14:49:17 +02:00
|
|
|
|
**If you're not using the JMS Serializer**, the `Symfony PropertyInfo component`_ is used to describe your models.
|
|
|
|
|
It supports doctrine annotations, type hints, and even PHP doc blocks.
|
|
|
|
|
It does also support serialization groups when using the Symfony serializer.
|
2018-01-04 17:47:47 +01:00
|
|
|
|
|
2018-02-20 09:59:00 +01:00
|
|
|
|
**If you're using the JMS Serializer**, the metadata of the JMS serializer are used by default to describe your
|
|
|
|
|
models. Additional information is extracted from the PHP doc block comment,
|
|
|
|
|
but the property types must be specified in the JMS annotations.
|
2018-01-04 17:47:47 +01:00
|
|
|
|
|
2018-02-20 09:59:00 +01:00
|
|
|
|
In case you prefer using the `Symfony PropertyInfo component`_ (you
|
|
|
|
|
won't be able to use JMS serialization groups), you can disable JMS serializer
|
|
|
|
|
support in your config:
|
2018-01-04 17:47:47 +01:00
|
|
|
|
|
2018-02-20 09:59:00 +01:00
|
|
|
|
.. code-block:: yaml
|
2018-01-09 10:31:38 +01:00
|
|
|
|
|
2018-02-20 09:59:00 +01:00
|
|
|
|
nelmio_api_doc:
|
|
|
|
|
models: { use_jms: false }
|
2018-01-04 14:33:02 +01:00
|
|
|
|
|
2018-05-05 14:49:17 +02:00
|
|
|
|
When using the JMS serializer combined with `willdurand/Hateoas`_ (and the `BazingaHateoasBundle`_),
|
|
|
|
|
HATEOAS metadata are automatically extracted
|
|
|
|
|
|
2018-02-20 09:59:00 +01:00
|
|
|
|
If you want to customize the documentation of a property of an object, you can use ``@SWG\Property``::
|
2018-01-04 14:33:02 +01:00
|
|
|
|
|
2018-04-10 11:17:11 +02:00
|
|
|
|
use Nelmio\ApiDocBundle\Annotation\Model;
|
2018-02-20 09:59:00 +01:00
|
|
|
|
use Swagger\Annotations as SWG;
|
2018-01-04 14:33:02 +01:00
|
|
|
|
|
2018-02-20 09:59:00 +01:00
|
|
|
|
class User
|
|
|
|
|
{
|
|
|
|
|
/**
|
|
|
|
|
* @var int
|
|
|
|
|
* @SWG\Property(description="The unique identifier of the user.")
|
|
|
|
|
*/
|
|
|
|
|
public $id;
|
2018-01-04 14:33:02 +01:00
|
|
|
|
|
2018-02-20 09:59:00 +01:00
|
|
|
|
/**
|
|
|
|
|
* @SWG\Property(type="string", maxLength=255)
|
|
|
|
|
*/
|
|
|
|
|
public $username;
|
2018-03-17 19:23:29 +01:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @SWG\Property(ref=@Model(type=User::class))
|
|
|
|
|
*/
|
|
|
|
|
public $friend;
|
2018-02-20 09:59:00 +01:00
|
|
|
|
}
|
2018-01-04 14:33:02 +01:00
|
|
|
|
|
2018-03-19 14:44:15 -03:00
|
|
|
|
See the `OpenAPI 2.0 specification`__ to see all the available fields of ``@SWG\Property``.
|
2018-01-04 14:33:02 +01:00
|
|
|
|
|
2018-02-20 09:59:00 +01:00
|
|
|
|
__ https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#schemaObject
|
2018-01-05 13:08:02 +01:00
|
|
|
|
|
|
|
|
|
Learn more
|
|
|
|
|
----------
|
|
|
|
|
|
|
|
|
|
If you need more complex features, take a look at:
|
|
|
|
|
|
|
|
|
|
.. toctree::
|
|
|
|
|
:maxdepth: 1
|
|
|
|
|
|
2018-01-09 10:31:38 +01:00
|
|
|
|
areas
|
2018-02-13 18:13:09 +02:00
|
|
|
|
faq
|
|
|
|
|
|
2018-02-20 09:59:00 +01:00
|
|
|
|
.. _`Symfony PropertyInfo component`: https://symfony.com/doc/current/components/property_info.html
|
2018-05-05 14:49:17 +02:00
|
|
|
|
.. _`willdurand/Hateoas`: https://github.com/willdurand/Hateoas
|
|
|
|
|
.. _`BazingaHateoasBundle`: https://github.com/willdurand/BazingaHateoasBundle
|
|
|
|
|
.. _`JMS serializer`: https://jmsyst.com/libs/serializer
|
|
|
|
|
.. _`Symfony form`: https://symfony.com/doc/current/forms.html
|
|
|
|
|
.. _`Symfony serializer`: https://symfony.com/doc/current/components/serializer.html
|