2018-02-13 18:13:09 +02:00
Frequently Asked Questions (FAQ)
================================
2018-05-07 10:05:03 +02:00
Sharing parameter configuration
-------------------------------
2018-02-20 09:59:00 +01:00
2018-10-31 16:33:06 +01:00
Q: I use the same value in multiple endpoints. How can I avoid duplicating the descriptions?
2018-02-20 09:59:00 +01:00
2020-05-28 13:19:11 +02:00
A: You can configure `` schemas `` in the nelmio_api_doc configuration and then reference them:
2018-05-07 10:05:03 +02:00
.. code-block :: yaml
# config/nelmio_api_doc.yml
nelmio_api_doc:
documentation:
2020-05-28 13:19:11 +02:00
components:
schemas:
NelmioImageList:
description: "Response for some queries"
type: object
properties:
total:
type: integer
example: 42
2018-05-07 10:05:03 +02:00
items:
2020-05-28 13:19:11 +02:00
type: array
items:
$ref: "#/components/schemas/ImageMetadata"
2018-05-07 10:05:03 +02:00
.. code-block :: php
// src/App/Controller/NelmioController.php
/**
2020-05-28 13:19:11 +02:00
* @OA\Response(
2018-05-07 10:05:03 +02:00
* response=200,
* description="List of image definitions",
2020-05-28 13:19:11 +02:00
* @OA\JsonContent(@OA\Schema(
2018-05-07 10:05:03 +02:00
* type="object",
* title="ListOperationsResponse",
2020-05-28 13:19:11 +02:00
* additionalProperties={"$ref": "#/components/schemas/NelmioImageList"}
* ))
2018-05-07 10:05:03 +02:00
*/
Optional Path Parameters
------------------------
Q: I have a controller with an optional path parameter. In swagger-ui, the parameter is required - can I make it
2018-10-31 16:34:46 +01:00
optional? The controller might look like this::
2018-05-07 10:05:03 +02:00
/**
* Get all user meta or metadata for a specific field.
*
* @Route("/{user}/meta/{metaName}",
* methods={"GET"},
* name="get_user_metadata"
* )
*
2020-05-28 13:19:11 +02:00
* @OA\Response(
2018-05-07 10:05:03 +02:00
* response=200,
* description="Json object with all user meta data or a json string with the value of the requested field"
* )
*/
public function getAction(string $user, string $metaName = null)
{
...
}
2018-05-08 08:08:20 +02:00
A: Optional path parameters are not supported by the OpenAPI specification. The solution to this is to define two
2018-10-31 16:34:46 +01:00
separate actions in your controller. For example::
2018-05-07 10:05:03 +02:00
/**
* Get all user meta data.
*
* @Route("/{user}/meta",
* methods={"GET"},
* name="get_user_metadata"
* )
*
2020-05-28 13:19:11 +02:00
* @OA\Response(
2018-05-07 10:05:03 +02:00
* response=200,
* description="Json hashmap with all user meta data",
2020-05-28 13:19:11 +02:00
* @OA\JsonContent(@OA\Schema(
2018-05-07 10:05:03 +02:00
* type="object",
* example={"foo": "bar", "hello": "world"}
2020-05-28 13:19:11 +02:00
* ))
2018-05-07 10:05:03 +02:00
* )
*/
public function cgetAction(string $user)
{
return $this->getAction($user, null);
}
/**
* Get user meta for a specific field.
*
* @Route("/{user}/meta/{metaName}",
* methods={"GET"},
* name="get_user_metadata_single"
* )
*
2020-05-28 13:19:11 +02:00
* @OA\Response(
2018-05-07 10:05:03 +02:00
* response=200,
* description="A json string with the value of the requested field",
2020-05-28 13:19:11 +02:00
* @OA\JsonContent(@OA\Schema(
2018-05-07 10:05:03 +02:00
* type="string"
2020-05-28 13:19:11 +02:00
* ))
2018-05-07 10:05:03 +02:00
* )
*/
public function getAction(string $user, string $metaName = null)
{
...
}
2018-05-08 08:08:20 +02:00
The first action is redundant for Symfony, but adds all the relevant documentation for the OpenAPI specification.
2018-05-07 10:05:03 +02:00
Asset files not loaded
----------------------
Q: How do I fix 404 or 406 HTTP status on NelmioApiDocBundle assets files (css, js, images)?
2018-05-08 08:08:20 +02:00
A: The assets normally are installed by composer if any command event (usually `` post-install-cmd `` or
2018-10-31 16:34:46 +01:00
`` post-update-cmd `` ) triggers the `` ScriptHandler::installAssets `` script.
If you have not set up this script, you can manually execute this command:
2018-05-07 10:05:03 +02:00
.. code-block :: bash
$ bin/console assets:install --symlink
2018-02-20 09:59:00 +01:00
2018-07-16 09:45:18 +02:00
Re-add Google Fonts
-------------------
2018-07-16 14:15:27 +02:00
Q: How can I change the font for the UI?
2018-07-16 09:45:18 +02:00
2018-07-16 14:15:27 +02:00
A: We removed the google fonts in 3.3 to avoid the external request for GDPR reasons. To change the font, you can :doc: `customize the template <customization>` to add this style information:
2018-07-16 09:45:18 +02:00
.. code-block :: twig
{# templates/bundles/NelmioApiDocBundle/SwaggerUI/index.html.twig #}
2020-05-28 13:19:11 +02:00
2018-07-16 14:15:27 +02:00
{#
To avoid a "reached nested level" error an exclamation mark `!` has to be added
See https://symfony.com/blog/new-in-symfony-3-4-improved-the-overriding-of-templates
#}
{% extends '@!NelmioApiDoc/SwaggerUi/index.html.twig' %}
2020-05-28 13:19:11 +02:00
2018-07-16 09:45:18 +02:00
{% block stylesheets %}
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:400,700|Source+Code+Pro:300,600|Titillium+Web:400,600,700">
{{ parent() }}
<style type="text/css" rel="stylesheet">
#formats {
font-family: Open Sans,sans-serif;
}
.swagger-ui .opblock-tag,
.swagger-ui .opblock .opblock-section-header label,
.swagger-ui .opblock .opblock-section-header h4,
.swagger-ui .opblock .opblock-summary-method,
.swagger-ui .tab li,
.swagger-ui .scheme-container .schemes>label,
.swagger-ui .loading-container .loading:after,
.swagger-ui .btn,
.swagger-ui .btn.cancel,
.swagger-ui select,
.swagger-ui label,
.swagger-ui .dialog-ux .modal-ux-content h4,
.swagger-ui .dialog-ux .modal-ux-header h3,
.swagger-ui section.models h4,
.swagger-ui section.models h5,
.swagger-ui .model-title,
.swagger-ui .parameter__name,
.swagger-ui .topbar a,
.swagger-ui .topbar .download-url-wrapper .download-url-button,
.swagger-ui .info .title small pre,
.swagger-ui .scopes h2,
.swagger-ui .errors-wrapper hgroup h4 {
font-family: Open Sans,sans-serif!important;
}
</style>
{% endblock stylesheets %}
2019-06-15 16:22:54 +03:00
Endpoints grouping
------------------
Q: Areas feature doesn't fit my needs. So how can I group similar endpoints of one or more controllers in a separate section in the documentation?
2020-05-28 13:19:11 +02:00
A: Use `` @OA\Tag `` annotation.
2019-06-15 16:22:54 +03:00
.. code-block :: php
/**
* Class BookmarkController
*
2020-05-28 13:19:11 +02:00
* @OA\Tag(name="Bookmarks")
2019-06-15 16:22:54 +03:00
*/
class BookmarkController extends AbstractFOSRestController implements ContextPresetInterface
{
//...
}