From d25dd30453ac9948f41491a6ea367d28e464fac2 Mon Sep 17 00:00:00 2001 From: William Durand <will+git@drnd.me> Date: Tue, 27 Oct 2015 10:27:13 +0100 Subject: [PATCH] Refactor doc --- Resources/doc/commands.md | 21 + Resources/doc/configuration-in-depth.md | 141 +++++ Resources/doc/configuration-reference.md | 59 +++ Resources/doc/dunglasapibundle.md | 25 + Resources/doc/faq.md | 15 + Resources/doc/index.md | 613 +--------------------- Resources/doc/multiple-api-doc.md | 65 +++ Resources/doc/other-bundle-annotations.md | 104 ++++ Resources/doc/sandbox.md | 58 ++ Resources/doc/swagger-support.md | 59 ++- Resources/doc/the-apidoc-annotation.md | 177 +++++++ 11 files changed, 718 insertions(+), 619 deletions(-) create mode 100644 Resources/doc/commands.md create mode 100644 Resources/doc/configuration-in-depth.md create mode 100644 Resources/doc/configuration-reference.md create mode 100644 Resources/doc/dunglasapibundle.md create mode 100644 Resources/doc/faq.md create mode 100644 Resources/doc/multiple-api-doc.md create mode 100644 Resources/doc/other-bundle-annotations.md create mode 100644 Resources/doc/sandbox.md create mode 100644 Resources/doc/the-apidoc-annotation.md diff --git a/Resources/doc/commands.md b/Resources/doc/commands.md new file mode 100644 index 0000000..3e01109 --- /dev/null +++ b/Resources/doc/commands.md @@ -0,0 +1,21 @@ +Commands +-------- + +A command is provided in order to dump the documentation in `json`, `markdown`, +or `html`. + + php app/console api:doc:dump [--format="..."] + +The `--format` option allows to choose the format (default is: `markdown`). + +For example to generate a static version of your documentation you can use: + + php app/console api:doc:dump --format=html > api.html + +By default, the generated HTML will add the sandbox feature if you didn't +disable it in the configuration. If you want to generate a static version of +your documentation without sandbox, use the `--no-sandbox` option. + +--- + +[back to index](index.md) diff --git a/Resources/doc/configuration-in-depth.md b/Resources/doc/configuration-in-depth.md new file mode 100644 index 0000000..dfecdf9 --- /dev/null +++ b/Resources/doc/configuration-in-depth.md @@ -0,0 +1,141 @@ +Configuration In-Depth +---------------------- + +* [API Name](#api-name) +* [Authentication Methods](#authentication-methods) +* [Section Exclusion](#section-exclusion) +* [Parsers](#parsers) +* [MOTD](#motd) +* [Caching](#caching) + +--- + +### API Name + +You can specify your own API name: + +```yaml +# app/config/config.yml +nelmio_api_doc: + name: My API +``` + +### Authentication Methods + +You can choose between different authentication methods: + +```yaml +# app/config/config.yml +nelmio_api_doc: + sandbox: + authentication: + delivery: header + name: X-Custom + +# app/config/config.yml +nelmio_api_doc: + sandbox: + authentication: + delivery: query + name: param + +# app/config/config.yml +nelmio_api_doc: + sandbox: + authentication: + delivery: http + type: basic # or bearer +``` + +When choosing an `http` delivery, `name` defaults to `Authorization`, and the +header value will automatically be prefixed by the corresponding type (ie. +`Basic` or `Bearer`). + +### Section Exclusion + +You can specify which sections to exclude from the documentation generation: + +```yaml +# app/config/config.yml +nelmio_api_doc: + exclude_sections: ["privateapi", "testapi"] +``` + +Note that `exclude_sections` will literally exclude a section from your api +documentation. It's possible however to create multiple views by specifying the +`views` parameter within the `@ApiDoc` annotations. This allows you to move +private or test methods to a complete different view of your documentation +instead. + +### Parsers + +By default, all registered parsers are used, but sometimes you may want to +define which parsers you want to use. The `parsers` attribute is used to +configure a list of parsers that will be used: + +```php +output={ + "class" = "Acme\Bundle\Entity\User", + "parsers" = { + "Nelmio\ApiDocBundle\Parser\JmsMetadataParser", + "Nelmio\ApiDocBundle\Parser\ValidationParser" + } +} +``` + +In this case the parsers `JmsMetadataParser` and `ValidationParser` are used to +generate returned data. This feature also works for both the `input` and +`output` properties. + +Moreover, the bundle provides a way to register multiple `input` parsers. The +first parser that can handle the specified input is used, so you can configure +their priorities via container tags. Here's an example parser service +registration: + +```yaml +# app/config/config.yml +services: + mybundle.api_doc.extractor.custom_parser: + class: MyBundle\Parser\CustomDocParser + tags: + - { name: nelmio_api_doc.extractor.parser, priority: 2 } +``` + +### MOTD + +You can also define your own motd content (above methods list). All you have to +do is add to configuration: + +```yaml +# app/config/config.yml +nelmio_api_doc: + # ... + motd: + template: AcmeApiBundle::Components/motd.html.twig +``` + +### Caching + +It is a good idea to enable the internal caching mechanism on production: + +```yaml +# app/config/config.yml +nelmio_api_doc: + cache: + enabled: true +``` + +You can define an alternate location where the ApiDoc configurations are to be +cached: + +```yaml +# app/config/config.yml +nelmio_api_doc: + cache: + enabled: true + file: "/tmp/symfony-app/%kernel.environment%/api-doc.cache" +``` + +--- + +[back to index](index.md) diff --git a/Resources/doc/configuration-reference.md b/Resources/doc/configuration-reference.md new file mode 100644 index 0000000..bad19b1 --- /dev/null +++ b/Resources/doc/configuration-reference.md @@ -0,0 +1,59 @@ +Configuration Reference +----------------------- + +``` yaml +nelmio_api_doc: + name: 'API documentation' + exclude_sections: [] + default_sections_opened: true + motd: + template: 'NelmioApiDocBundle::Components/motd.html.twig' + request_listener: + enabled: true + parameter: _doc + sandbox: + enabled: true + endpoint: null + accept_type: null + body_format: + formats: + + # Defaults: + - form + - json + default_format: ~ # One of "form"; "json" + request_format: + formats: + + # Defaults: + json: application/json + xml: application/xml + method: ~ # One of "format_param"; "accept_header" + default_format: json + authentication: + delivery: ~ # Required + name: ~ # Required + + # Required if http delivery is selected. + type: ~ # One of "basic"; "bearer" + custom_endpoint: false + entity_to_choice: true + swagger: + api_base_path: /api + swagger_version: '1.2' + api_version: '0.1' + info: + title: Symfony2 + description: 'My awesome Symfony2 app!' + TermsOfServiceUrl: null + contact: null + license: null + licenseUrl: null + cache: + enabled: false + file: '%kernel.cache_dir%/api-doc.cache' +``` + +--- + +[back to index](index.md) diff --git a/Resources/doc/dunglasapibundle.md b/Resources/doc/dunglasapibundle.md new file mode 100644 index 0000000..46cdf2a --- /dev/null +++ b/Resources/doc/dunglasapibundle.md @@ -0,0 +1,25 @@ +DunglasApiBundle Support +------------------------ + +This bundle recognizes and documents resources exposed with +[DunglasApiBundle](https://github.com/dunglas/DunglasApiBundle). + +Install NelmioApiDocBundle and the documentation will be automatically +available. To enable the sandbox, use the following configuration: + +```yaml +# app/config/config.yml +nelmio_api_doc: + sandbox: + accept_type: "application/json" + body_format: + formats: [ "json" ] + default_format: "json" + request_format: + formats: + json: "application/json" +``` + +--- + +[back to index](index.md) diff --git a/Resources/doc/faq.md b/Resources/doc/faq.md new file mode 100644 index 0000000..467e699 --- /dev/null +++ b/Resources/doc/faq.md @@ -0,0 +1,15 @@ +Frequently Asked Questions +-------------------------- + +### How can I remove the parameter `_format` sent in `POST` and `PUT` request? + +``` yaml +nelmio_api_doc: + sandbox: + request_format: + method: accept_header +``` + +--- + +[back to index](index.md) diff --git a/Resources/doc/index.md b/Resources/doc/index.md index e1c9854..8249698 100644 --- a/Resources/doc/index.md +++ b/Resources/doc/index.md @@ -4,6 +4,19 @@ NelmioApiDocBundle The **NelmioApiDocBundle** bundle allows you to generate a decent documentation for your APIs. +* [Installation](#installation) +* [Usage](#usage) + - [The `ApiDoc()` Annotation](the-apidoc-annotation.md) + - [Multiple API Documentation a.k.a. "Views"](multiple-api-doc.md) + - [Other Bundle Annotations](other-bundle-annotations.md) + - [Swagger Support](swagger-support.md) + - [DunglasApiBundle Support](dunglasapibundle.md) + - [Sandbox](sandbox.md) + - [Commands](commands.md) +* [Configuration In-Depth](configuration-in-depth.md) +* [Frequently Asked Questions](faq.md) +* [Configuration Reference](configuration-reference.md) + Installation ------------ @@ -57,326 +70,16 @@ Usage The main problem with documentation is to keep it up to date. That's why the **NelmioApiDocBundle** uses introspection a lot. Thanks to an annotation, it's -really easy to document an API method. - -### The ApiDoc() Annotation - -The bundle provides an `ApiDoc()` annotation for your controllers: - -```php -<?php - -namespace Your\Namespace; - -use Nelmio\ApiDocBundle\Annotation\ApiDoc; - -class YourController extends Controller -{ - /** - * This is the documentation description of your method, it will appear - * on a specific pane. It will read all the text until the first - * annotation. - * - * @ApiDoc( - * resource=true, - * description="This is a description of your API method", - * filters={ - * {"name"="a-filter", "dataType"="integer"}, - * {"name"="another-filter", "dataType"="string", "pattern"="(foo|bar) ASC|DESC"} - * } - * ) - */ - public function getAction() - { - } - - /** - * @ApiDoc( - * description="Create a new Object", - * input="Your\Namespace\Form\Type\YourType", - * output="Your\Namespace\Class" - * ) - */ - public function postAction() - { - } - - /** - * @ApiDoc( - * description="Returns a collection of Object", - * requirements={ - * { - * "name"="limit", - * "dataType"="integer", - * "requirement"="\d+", - * "description"="how many objects to return" - * } - * }, - * parameters={ - * {"name"="categoryId", "dataType"="integer", "required"=true, "description"="category id"} - * } - * ) - */ - public function cgetAction($limit) - { - } -} -``` - -The following properties are available: - -* `section`: allow to group resources - -* `resource`: whether the method describes a main resource or not (default: `false`); - -* `description`: a description of the API method; - -* `https`: whether the method described requires the https protocol (default: `false`); - -* `deprecated`: allow to set method as deprecated (default: `false`); - -* `tags`: allow to tag a method (e.g. `beta` or `in-development`). Either a single tag or an array of tags. Each tag can have an optional hex colorcode attached. - -```php -<?php - -class YourController -{ - /** - * @ApiDoc( - * tags={ - * "stable", - * "deprecated" = "#ff0000" - * } - * ) - */ - public function myFunction() - { - // ... - } -} -``` - -* `filters`: an array of filters; - -* `requirements`: an array of requirements; - -* `parameters`: an array of parameters; - -* `input`: the input type associated to the method (currently this supports Form Types, classes with JMS Serializer - metadata, classes with Validation component metadata and classes that implement JsonSerializable) useful for POST|PUT methods, either as FQCN or as form type - (if it is registered in the form factory in the container). - -* `output`: the output type associated with the response. Specified and parsed the same way as `input`. - -* `statusCodes`: an array of HTTP status codes and a description of when that status is returned; Example: - -```php -<?php - -class YourController -{ - /** - * @ApiDoc( - * statusCodes={ - * 200="Returned when successful", - * 403="Returned when the user is not authorized to say hello", - * 404={ - * "Returned when the user is not found", - * "Returned when something else is not found" - * } - * } - * ) - */ - public function myFunction() - { - // ... - } -} -``` - -* `views`: the view(s) under which this resource will be shown. Leave empty to - specify the default view. Either a single view, or an array of views. - -Each _filter_ has to define a `name` parameter, but other parameters are free. Filters are often optional -parameters, and you can document them as you want, but keep in mind to be consistent for the whole documentation. - -If you set `input`, then the bundle automatically extracts parameters based on the given type, -and determines for each parameter its data type, and if it's required or not. - -For classes parsed with JMS metadata, description will be taken from the properties doc comment, if available. - -For Form Types, you can add an extra option named `description` on each field: - -```php -<?php - -class YourType extends AbstractType -{ - /** - * {@inheritdoc} - */ - public function buildForm(FormBuilder $builder, array $options) - { - $builder->add('note', null, array( - 'description' => 'this is a note', - )); - - // ... - } -} -``` - -The bundle will also get information from the routing definition -(`requirements`, `path`, etc), so to get the best out of it you should -define strict methods requirements etc. - -### Multiple API Documentation ("Views") - -With the `views` tag in the `@ApiDoc` annotation, it is possible to create -different views of your API documentation. Without the tag, all methods are -located in the `default` view, and can be found under the normal API -documentation url. - -You can specify one or more _view_ names under which the method will be -visible. - -An example: - -```php - /** - * A resource - * - * @ApiDoc( - * resource=true, - * description="This is a description of your API method", - * views = { "default", "premium" } - * ) - */ - public function getAction() - { - } - - /** - * Another resource - * - * @ApiDoc( - * resource=true, - * description="This is a description of another API method", - * views = { "premium" } - * ) - */ - public function getAnotherAction() - { - } -``` - -In this case, only the first resource will be available under the default view, -while both methods will be available under the `premium` view. - -#### Accessing Specific API Views - -The `default` view can be found at the normal location. Other views can be -found at `http://your.documentation/<view name>`. - -For instance, if your documentation is located at: - - http://example.org/doc/api/v1/ - -then the `premium` view will be located at: - - http://example.org/doc/api/v1/premium - - -### Other Bundle Annotations - -Also bundle will get information from the other annotations: - -* `@FOS\RestBundle\Controller\Annotations\RequestParam` - use as `parameters` - -* `@FOS\RestBundle\Controller\Annotations\QueryParam` - use as `requirements` (when strict parameter is true), `filters` (when strict is false) - -* `@JMS\SecurityExtraBundle\Annotation\Secure` - set `authentication` to true, `authenticationRoles` to the given roles - -* `@Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache` - set `cache` - -### PHPDoc - -Actions marked as `@deprecated` will be marked as such in the interface. - -#### JMS Serializer Features - -The bundle has support for some of the JMS Serializer features and uses this -extra piece of information in the generated documentation. - -##### Group Exclusion Strategy - -If your classes use [JMS Group Exclusion -Strategy](http://jmsyst.com/libs/serializer/master/cookbook/exclusion_strategies#creating-different-views-of-your-objects), -you can specify which groups to use when generating the documentation by using -this syntax : - - ```php - input={ - "class"="Acme\Bundle\Entity\User", - "groups"={"update", "public"} - } - ``` - -In this case the groups 'update' and 'public' are used. - -This feature also works for the `output` property. - -##### Versioning Objects - -If your `output` classes use [versioning capabilities of JMS -Serializer](http://jmsyst.com/libs/serializer/master/cookbook/exclusion_strategies#versioning-objects), -the versioning information will be automatically used when generating the -documentation. - -#### Form Types Features - -Even if you use `FormFactoryInterface::createNamed('', 'your_form_type')` the documentation will generate the form type name as the prefix for inputs -(`your_form_type[param]` ... instead of just `param`). - -You can specify which prefix to use with the `name` key in the `input` section: - -```php -input = { - "class" = "your_form_type", - "name" = "" -} -``` - -You can also add some options to pass to the form. You just have to use the `options` key: - -```php -input = { - "class" = "your_form_type", - "options" = {"method" = "PUT"}, -} -``` - -#### Used Parsers - -By default, all registered parsers are used, but sometimes you may want to -define which parsers you want to use. The `parsers` attribute is used to -configure a list of parsers that will be used: - -```php -output={ - "class" = "Acme\Bundle\Entity\User", - "parsers" = { - "Nelmio\ApiDocBundle\Parser\JmsMetadataParser", - "Nelmio\ApiDocBundle\Parser\ValidationParser" - } -} -``` - -In this case the parsers `JmsMetadataParser` and `ValidationParser` are used to -generate returned data. - -This feature also works for both the `input` and `output` properties. +really easy to document an API method. The following chapters will help you +setup your API documentation: + +* [The `ApiDoc()` Annotation](the-apidoc-annotation.md) +* [Multiple API Documentation a.k.a. "Views"](multiple-api-doc.md) +* [Other Bundle Annotations](other-bundle-annotations.md) +* [Swagger Support](swagger-support.md) +* [DunglasApiBundle Support](dunglasapibundle.md) +* [Sandbox](sandbox.md) +* [Commands](commands.md) ### Web Interface @@ -390,273 +93,3 @@ You can browse the whole documentation at: `http://example.org/api/doc`. By calling an URL with the parameter `?_doc=1`, you will get the corresponding documentation if available. - -### Sandbox - -This bundle provides a sandbox mode in order to test API methods. You can -configure this sandbox using the following parameters: - -```yaml -# app/config/config.yml -nelmio_api_doc: - sandbox: - authentication: # default is `~` (`null`), if set, the sandbox automatically - # send authenticated requests using the configured `delivery` - - name: access_token # access token name or query parameter name or header name - - delivery: http # `query`, `http`, and `header` are supported - - # Required if http delivery is selected. - type: basic # `basic`, `bearer` are supported - - custom_endpoint: true # default is `false`, if `true`, your user will be able to - # specify its own endpoint - - enabled: true # default is `true`, you can set this parameter to `false` - # to disable the sandbox - - endpoint: http://sandbox.example.com/ # default is `/app_dev.php`, use this parameter - # to define which URL to call through the sandbox - - accept_type: application/json # default is `~` (`null`), if set, the value is - # automatically populated as the `Accept` header - - body_format: - formats: [ form, json ] # array of enabled body formats, - # remove all elements to disable the selectbox - default_format: form # default is `form`, determines whether to send - # `x-www-form-urlencoded` data or json-encoded - # data (by setting this parameter to `json`) in - # sandbox requests - - request_format: - formats: # default is `json` and `xml`, - json: application/json # override to add custom formats or disable - xml: application/xml # the default formats - - method: format_param # default is `format_param`, alternately `accept_header`, - # decides how to request the response format - - default_format: json # default is `json`, - # default content format to request (see formats) - - entity_to_choice: false # default is `true`, if `false`, entity collection - # will not be mapped as choice -``` -### Command - -A command is provided in order to dump the documentation in `json`, `markdown`, or `html`. - - php app/console api:doc:dump [--format="..."] - -The `--format` option allows to choose the format (default is: `markdown`). - -For example to generate a static version of your documentation you can use: - - php app/console api:doc:dump --format=html > api.html - -By default, the generated HTML will add the sandbox feature if you didn't disable it in the configuration. -If you want to generate a static version of your documentation without sandbox, use the `--no-sandbox` option. - -### Swagger support - -Read the [documentation for Swagger integration](https://github.com/nelmio/NelmioApiDocBundle/blob/master/Resources/doc/swagger-support.md) -for the necessary steps to make a Swagger-compliant documentation for your API. - -### DunglasApiBundle support - -This bundle recognizes and documents resources exposed with [DunglasApiBundle](https://github.com/dunglas/DunglasApiBundle). -Just install NelmioApiDoc and the documentation will be automatically available. To enable the sandbox, use the following -configuration: - -```yaml -# app/config/config.yml -nelmio_api_doc: - sandbox: - accept_type: "application/json" - body_format: - formats: [ "json" ] - default_format: "json" - request_format: - formats: - json: "application/json" -``` - -### Caching - -It is a good idea to enable the internal caching mechanism on production: - -```yaml -# app/config/config.yml -nelmio_api_doc: - cache: - enabled: true -``` - -Configuration In-Depth ----------------------- - -You can specify your own API name: - -```yaml -# app/config/config.yml -nelmio_api_doc: - name: My API -``` -You can choose between different authentication methods: - -```yaml -# app/config/config.yml -nelmio_api_doc: - sandbox: - authentication: - delivery: header - name: X-Custom - -# app/config/config.yml -nelmio_api_doc: - sandbox: - authentication: - delivery: query - name: param - -# app/config/config.yml -nelmio_api_doc: - sandbox: - authentication: - delivery: http - type: basic # or bearer -``` -When choosing an `http` delivery, `name` defaults to `Authorization`, -and the header value will automatically be prefixed by the corresponding type (ie. `Basic` or `Bearer`). - -You can specify which sections to exclude from the documentation generation: - -```yaml -# app/config/config.yml -nelmio_api_doc: - exclude_sections: ["privateapi", "testapi"] -``` - -Note that `exclude_sections` will literally exclude a section from your api -documentation. It's possible however to create multiple views by specifying the -`views` parameter within the `@ApiDoc` annotations. This allows you to move -private or test methods to a complete different view of your documentation -instead. - -The bundle provides a way to register multiple `input` parsers. The first parser -that can handle the specified input is used, so you can configure their -priorities via container tags. Here's an example parser service registration: - -```yaml -# app/config/config.yml -services: - mybundle.api_doc.extractor.custom_parser: - class: MyBundle\Parser\CustomDocParser - tags: - - { name: nelmio_api_doc.extractor.parser, priority: 2 } -``` -You can also define your own motd content (above methods list). All you have to -do is add to configuration: - -```yaml -# app/config/config.yml -nelmio_api_doc: - # ... - motd: - template: AcmeApiBundle::Components/motd.html.twig -``` - -You can define an alternate location where the ApiDoc configurations are to be cached: - -```yaml -# app/config/config.yml -nelmio_api_doc: - cache: - enabled: true - file: "/tmp/symfony-app/%kernel.environment%/api-doc.cache" -``` - -### Using Your Own Annotations - -If you have developed your own project-related annotations, and you want to parse them to populate -the `ApiDoc`, you can provide custom handlers as services. You just have to implement the -`Nelmio\ApiDocBundle\Extractor\HandlerInterface` and tag it as `nelmio_api_doc.extractor.handler`: - -```yaml -# app/config/config.yml -services: - mybundle.api_doc.extractor.my_annotation_handler: - class: MyBundle\AnnotationHandler\MyAnnotationHandler - tags: - - { name: nelmio_api_doc.extractor.handler } -``` - -Look at the built-in [Handlers](https://github.com/nelmio/NelmioApiDocBundle/tree/master/Extractor/Handler). - -### Frequently Asked Questions - -##### How can I remove the parameter `_format` sent in `POST` and `PUT` request? - -``` yaml -nelmio_api_doc: - sandbox: - request_format: - method: accept_header -``` - -### Configuration Reference - -``` yaml -nelmio_api_doc: - name: 'API documentation' - exclude_sections: [] - default_sections_opened: true - motd: - template: 'NelmioApiDocBundle::Components/motd.html.twig' - request_listener: - enabled: true - parameter: _doc - sandbox: - enabled: true - endpoint: null - accept_type: null - body_format: - formats: - - # Defaults: - - form - - json - default_format: ~ # One of "form"; "json" - request_format: - formats: - - # Defaults: - json: application/json - xml: application/xml - method: ~ # One of "format_param"; "accept_header" - default_format: json - authentication: - delivery: ~ # Required - name: ~ # Required - - # Required if http delivery is selected. - type: ~ # One of "basic"; "bearer" - custom_endpoint: false - entity_to_choice: true - swagger: - api_base_path: /api - swagger_version: '1.2' - api_version: '0.1' - info: - title: Symfony2 - description: 'My awesome Symfony2 app!' - TermsOfServiceUrl: null - contact: null - license: null - licenseUrl: null - cache: - enabled: false - file: '%kernel.cache_dir%/api-doc.cache' -``` diff --git a/Resources/doc/multiple-api-doc.md b/Resources/doc/multiple-api-doc.md new file mode 100644 index 0000000..e56997f --- /dev/null +++ b/Resources/doc/multiple-api-doc.md @@ -0,0 +1,65 @@ +Multiple API Documentation ("Views") +------------------------------------ + +* [Accessing Specific API Views](#accessing-specific-api-views) + +--- + +With the `views` tag in the `@ApiDoc` annotation, it is possible to create +different views of your API documentation. Without the tag, all methods are +located in the `default` view, and can be found under the normal API +documentation url. + +You can specify one or more _view_ names under which the method will be +visible. + +An example: + +```php + /** + * A resource + * + * @ApiDoc( + * resource=true, + * description="This is a description of your API method", + * views = { "default", "premium" } + * ) + */ + public function getAction() + { + } + + /** + * Another resource + * + * @ApiDoc( + * resource=true, + * description="This is a description of another API method", + * views = { "premium" } + * ) + */ + public function getAnotherAction() + { + } +``` + +In this case, only the first resource will be available under the default view, +while both methods will be available under the `premium` view. + + +#### Accessing Specific API Views + +The `default` view can be found at the normal location. Other views can be +found at `http://your.documentation/<view name>`. + +For instance, if your documentation is located at: + + http://example.org/doc/api/v1/ + +then the `premium` view will be located at: + + http://example.org/doc/api/v1/premium + +--- + +[back to index](index.md) diff --git a/Resources/doc/other-bundle-annotations.md b/Resources/doc/other-bundle-annotations.md new file mode 100644 index 0000000..dcc5348 --- /dev/null +++ b/Resources/doc/other-bundle-annotations.md @@ -0,0 +1,104 @@ +Other Bundle Annotations +------------------------ + +* [PHPDoc](#phpdoc) +* [JMS Serializer Features](#jms-serializer-features) + - [Group Exclusion Strategy](#group-exclusion-strategy) + - [Versioning Objects](#versioning-objects) +* [Form Types Features](#form-types-features) +* [Using Your Own Annotations](#using-your-own-annotations) + +--- + +This bundle will get information from the following other annotations: + +* `@FOS\RestBundle\Controller\Annotations\RequestParam` - use as `parameters` + +* `@FOS\RestBundle\Controller\Annotations\QueryParam` - use as `requirements` (when strict parameter is true), `filters` (when strict is false) + +* `@JMS\SecurityExtraBundle\Annotation\Secure` - set `authentication` to true, `authenticationRoles` to the given roles + +* `@Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache` - set `cache` + +### PHPDoc + +Actions marked as `@deprecated` will be marked as such in the interface. + +### JMS Serializer Features + +The bundle has support for some of the JMS Serializer features and uses this +extra piece of information in the generated documentation. + +#### Group Exclusion Strategy + +If your classes use [JMS Group Exclusion +Strategy](http://jmsyst.com/libs/serializer/master/cookbook/exclusion_strategies#creating-different-views-of-your-objects), +you can specify which groups to use when generating the documentation by using +this syntax : + + ```php + input={ + "class"="Acme\Bundle\Entity\User", + "groups"={"update", "public"} + } + ``` + +In this case the groups 'update' and 'public' are used. + +This feature also works for the `output` property. + +#### Versioning Objects + +If your `output` classes use [versioning capabilities of JMS +Serializer](http://jmsyst.com/libs/serializer/master/cookbook/exclusion_strategies#versioning-objects), +the versioning information will be automatically used when generating the +documentation. + +### Form Types Features + +Even if you use `FormFactoryInterface::createNamed('', 'your_form_type')` the +documentation will generate the form type name as the prefix for inputs +(`your_form_type[param]` ... instead of just `param`). + +You can specify which prefix to use with the `name` key in the `input` section: + +```php +input = { + "class" = "your_form_type", + "name" = "" +} +``` + +You can also add some options to pass to the form. You just have to use the `options` key: + +```php +input = { + "class" = "your_form_type", + "options" = {"method" = "PUT"}, +} +``` + + +### Using Your Own Annotations + +If you have developed your own project-related annotations, and you want to +parse them to populate the `ApiDoc`, you can provide custom handlers as +services. You just have to implement the +`Nelmio\ApiDocBundle\Extractor\HandlerInterface` and tag it as +`nelmio_api_doc.extractor.handler`: + +```yaml +# app/config/config.yml +services: + mybundle.api_doc.extractor.my_annotation_handler: + class: MyBundle\AnnotationHandler\MyAnnotationHandler + tags: + - { name: nelmio_api_doc.extractor.handler } +``` + +Look at the built-in +[Handlers](https://github.com/nelmio/NelmioApiDocBundle/tree/master/Extractor/Handler). + +--- + +[back to index](index.md) diff --git a/Resources/doc/sandbox.md b/Resources/doc/sandbox.md new file mode 100644 index 0000000..97909d4 --- /dev/null +++ b/Resources/doc/sandbox.md @@ -0,0 +1,58 @@ +Sandbox +------- + +This bundle provides a sandbox mode in order to test API methods. You can +configure this sandbox using the following parameters: + +```yaml +# app/config/config.yml +nelmio_api_doc: + sandbox: + authentication: # default is `~` (`null`), if set, the sandbox automatically + # send authenticated requests using the configured `delivery` + + name: access_token # access token name or query parameter name or header name + + delivery: http # `query`, `http`, and `header` are supported + + # Required if http delivery is selected. + type: basic # `basic`, `bearer` are supported + + custom_endpoint: true # default is `false`, if `true`, your user will be able to + # specify its own endpoint + + enabled: true # default is `true`, you can set this parameter to `false` + # to disable the sandbox + + endpoint: http://sandbox.example.com/ # default is `/app_dev.php`, use this parameter + # to define which URL to call through the sandbox + + accept_type: application/json # default is `~` (`null`), if set, the value is + # automatically populated as the `Accept` header + + body_format: + formats: [ form, json ] # array of enabled body formats, + # remove all elements to disable the selectbox + default_format: form # default is `form`, determines whether to send + # `x-www-form-urlencoded` data or json-encoded + # data (by setting this parameter to `json`) in + # sandbox requests + + request_format: + formats: # default is `json` and `xml`, + json: application/json # override to add custom formats or disable + xml: application/xml # the default formats + + method: format_param # default is `format_param`, alternately `accept_header`, + # decides how to request the response format + + default_format: json # default is `json`, + # default content format to request (see formats) + + entity_to_choice: false # default is `true`, if `false`, entity collection + # will not be mapped as choice +``` + +--- + +[back to index](index.md) diff --git a/Resources/doc/swagger-support.md b/Resources/doc/swagger-support.md index 59d34b8..8868ba4 100644 --- a/Resources/doc/swagger-support.md +++ b/Resources/doc/swagger-support.md @@ -1,11 +1,11 @@ -NelmioApiDocBundle -=================== +Swagger Support +--------------- -##Swagger support## +It is possible to make your application produce Swagger-compliant JSON output +based on `@ApiDoc` annotations, which can be used for consumption by +[swagger-ui](https://github.com/wordnik/swagger-ui). -It is now possible to make your application produce Swagger-compliant JSON output based on `@ApiDoc` annotations, which can be used for consumption by [swagger-ui](https://github.com/wordnik/swagger-ui). - -###Annotation options### +### Annotation options A couple of properties has been added to `@ApiDoc`: @@ -28,11 +28,13 @@ To define a __resource description__: ``` -The `resourceDescription` is distinct from `description` as it applies to the whole resource group and not just the particular API endpoint. +The `resourceDescription` is distinct from `description` as it applies to the +whole resource group and not just the particular API endpoint. #### Defining a form-type as a GET form -If you use forms to capture GET requests, you will have to specify the `paramType` to `query` in the annotation: +If you use forms to capture GET requests, you will have to specify the +`paramType` to `query` in the annotation: ```php @@ -44,14 +46,17 @@ If you use forms to capture GET requests, you will have to specify the `paramTyp * ... * ) */ - + public function searchAction(Request $request) { ``` ### Multiple response models -Swagger provides you the ability to specify alternate output models for different status codes. Example, `200` would return your default resource object in JSON form, but `400` may return a custom validation error list object. This can be specified through the `responseMap` property: +Swagger provides you the ability to specify alternate output models for +different status codes. Example, `200` would return your default resource object +in JSON form, but `400` may return a custom validation error list object. This +can be specified through the `responseMap` property: ```php <?php @@ -96,7 +101,11 @@ nelmio_api_swagger: Et voila!, simply specify http://yourdomain.com/api-docs in your `swagger-ui` instance and you are good to go. -__Note__: If your `swagger-ui` instance does not live under the same domain, you will probably encounter some problems related to same-origin policy violations. [NelmioCorsBundle](https://github.com/nelmio/NelmioCorsBundle) can solve this problem for you. Read through how to allow cross-site requests for the `/api-docs/*` pages. +__Note__: If your `swagger-ui` instance does not live under the same domain, you +will probably encounter some problems related to same-origin policy violations. +[NelmioCorsBundle](https://github.com/nelmio/NelmioCorsBundle) can solve this +problem for you. Read through how to allow cross-site requests for the +`/api-docs/*` pages. ### Dumping the Swagger-compliant JSON API definitions @@ -137,26 +146,18 @@ php app/console api:swagger:dump swagger-docs ### Model naming -By default, the model naming strategy used is the `dot_notation` strategy. The model IDs are simply the Fully Qualified Class Name (FQCN) of the class associated to it, with the `\` replaced with `.`: +By default, the model naming strategy used is the `dot_notation` strategy. The +model IDs are simply the Fully Qualified Class Name (FQCN) of the class +associated to it, with the `\` replaced with `.`: `Vendor\UserBundle\Entity\User => Vendor.UserBundle.Entity.User` -You can also change the `model_naming_strategy` in the configuration to `last_segment_only`, if you want model IDs to be just the class name minus the namespaces (`Vendor\UserBundle\Entity\User => User`). This will not afford you the guarantee that model IDs are unique, but that would really just depend on the classes you have in use. +You can also change the `model_naming_strategy` in the configuration to +`last_segment_only`, if you want model IDs to be just the class name minus the +namespaces (`Vendor\UserBundle\Entity\User => User`). This will not afford you +the guarantee that model IDs are unique, but that would really just depend on +the classes you have in use. -##Configuration reference +--- -```yml -nelmio_api_doc: - swagger: - api_base_path: /api - swagger_version: 1.2 - model_naming_strategy: dot_notation - api_version: 0.1 - info: - title: Symfony2 - description: My awesome Symfony2 app! - TermsOfServiceUrl: ~ - contact: ~ - license: ~ - licenseUrl: ~ -``` +[back to index](index.md) diff --git a/Resources/doc/the-apidoc-annotation.md b/Resources/doc/the-apidoc-annotation.md new file mode 100644 index 0000000..f56f9a5 --- /dev/null +++ b/Resources/doc/the-apidoc-annotation.md @@ -0,0 +1,177 @@ +The `ApiDoc()` Annotation +------------------------- + +The bundle provides an `ApiDoc()` annotation for your controllers: + +```php +<?php + +namespace Your\Namespace; + +use Nelmio\ApiDocBundle\Annotation\ApiDoc; + +class YourController extends Controller +{ + /** + * This is the documentation description of your method, it will appear + * on a specific pane. It will read all the text until the first + * annotation. + * + * @ApiDoc( + * resource=true, + * description="This is a description of your API method", + * filters={ + * {"name"="a-filter", "dataType"="integer"}, + * {"name"="another-filter", "dataType"="string", "pattern"="(foo|bar) ASC|DESC"} + * } + * ) + */ + public function getAction() + { + } + + /** + * @ApiDoc( + * description="Create a new Object", + * input="Your\Namespace\Form\Type\YourType", + * output="Your\Namespace\Class" + * ) + */ + public function postAction() + { + } + + /** + * @ApiDoc( + * description="Returns a collection of Object", + * requirements={ + * { + * "name"="limit", + * "dataType"="integer", + * "requirement"="\d+", + * "description"="how many objects to return" + * } + * }, + * parameters={ + * {"name"="categoryId", "dataType"="integer", "required"=true, "description"="category id"} + * } + * ) + */ + public function cgetAction($limit) + { + } +} +``` + +The following properties are available: + +* `section`: allow to group resources + +* `resource`: whether the method describes a main resource or not (default: `false`); + +* `description`: a description of the API method; + +* `https`: whether the method described requires the https protocol (default: `false`); + +* `deprecated`: allow to set method as deprecated (default: `false`); + +* `tags`: allow to tag a method (e.g. `beta` or `in-development`). Either a single tag or an array of tags. Each tag can have an optional hex colorcode attached. + +```php +<?php + +class YourController +{ + /** + * @ApiDoc( + * tags={ + * "stable", + * "deprecated" = "#ff0000" + * } + * ) + */ + public function myFunction() + { + // ... + } +} +``` + +* `filters`: an array of filters; + +* `requirements`: an array of requirements; + +* `parameters`: an array of parameters; + +* `input`: the input type associated to the method (currently this supports Form Types, classes with JMS Serializer + metadata, classes with Validation component metadata and classes that implement JsonSerializable) useful for POST|PUT methods, either as FQCN or as form type + (if it is registered in the form factory in the container). + +* `output`: the output type associated with the response. Specified and parsed the same way as `input`. + +* `statusCodes`: an array of HTTP status codes and a description of when that status is returned; Example: + +```php +<?php + +class YourController +{ + /** + * @ApiDoc( + * statusCodes={ + * 200="Returned when successful", + * 403="Returned when the user is not authorized to say hello", + * 404={ + * "Returned when the user is not found", + * "Returned when something else is not found" + * } + * } + * ) + */ + public function myFunction() + { + // ... + } +} +``` + +* `views`: the view(s) under which this resource will be shown. Leave empty to + specify the default view. Either a single view, or an array of views. + +Each _filter_ has to define a `name` parameter, but other parameters are free. Filters are often optional +parameters, and you can document them as you want, but keep in mind to be consistent for the whole documentation. + +If you set `input`, then the bundle automatically extracts parameters based on the given type, +and determines for each parameter its data type, and if it's required or not. + +For classes parsed with JMS metadata, description will be taken from the properties doc comment, if available. + +For Form Types, you can add an extra option named `description` on each field: + +```php +<?php + +class YourType extends AbstractType +{ + /** + * {@inheritdoc} + */ + public function buildForm(FormBuilder $builder, array $options) + { + $builder->add('note', null, array( + 'description' => 'this is a note', + )); + + // ... + } +} +``` + +The bundle will also get information from the routing definition +(`requirements`, `path`, etc), so to get the best out of it you should +define strict methods requirements etc. + + +--- + +[back to index](index.md)