Автоматическое Создание Документации Api Через Аннотации Или Как Подойти К Документированию Api

Прежде чем писать эту статью, я пытался найти что-то подобное, и, возможно, в силу каких-то обстоятельств, так и не нашел.

Я решил изложить свое видение этого вопроса.

Откуда взялась идея? За последние несколько лет я сменил 3-4 компании, в которых получил мягко говоря лапшу, толстые контроллеры и минимум аннотаций.

Трудно сказать, с чем именно связано отсутствие аннотаций; возможно, это простая лень или незнание того, что аннотации позволяют описывать больше, чем просто входные параметры классов/методов.

А когда дело начинает касаться API-контроллеров, то вообще весело; прикрепить FosRestBundle не проблема (я говорю о более ленивом варианте, чем писать всё самому, хотя, как показывает практика, бандлом проще).

Итак, о чем я говорю? Прикрепили бандл, описали (в лучшем случае) входные параметры и правила с помощью ParameterFetcher. Вроде все готово и работает, запросы бегут, ответы летят. А вот что делать, когда нужна документация по API, я просто вариантов не увидел.

Самыми смертоносными были текстовые файлы в папке Resource/doc – но, по крайней мере, они служили там, где были нужны.

Я уверен, что для большинства из тех, кто прочитает эту статью и не закроет ее сразу, многое уже будет известно, но я все равно это опишу.

Все примеры я приведу со ссылками, где их взять и скриншотами того, как это работает. Итак, сам комплект - здесь .

Далее идет спойлер с установкой NelimoApiDocBundle. щелкнуть Устанавливается, как и все остальное, очень легко и просто через Composer:

  
  
  
  
  
   

require nelmio/api-doc-bundle

Дальше еще проще в AppKernel.php

public function registerBundles() { //.

return array( // .

new Nelmio\ApiDocBundle\NelmioApiDocBundle(), ); }

Самое главное (ну хотя бы по отношению к статье) прописываем пути самого дженерика:

# app/config/routing.yml NelmioApiDocBundle: resource: "@NelmioApiDocBundle/Resources/config/routing.yml" prefix: /api/doc

Далее я чисто поверхностно пройдусь по самым простым и основным моментам, предоставив вашему пытливому уму возможность прочитать и разобрать документацию, если возникнет такое желание.

Итак, у нас есть простой метод: щелкнуть

public function getIndexAction(ParamFetcher $paramFetcher) { $view = View::create(); $result = [ 'status' => 'success', 'data' => [ 'someKey' => 'SomeValue' ] ]; $view->setData(['result' => $result]); return $view; }

Пока что этот метод ничем особенным не выделяется, и мы его немного расширим.

щелкнуть

/** * @Get(name="_additional_name_in_route", path="/") * * @Template(engine="twig", template="HabrApiDocBundle:Default:index.html.twig") * * @QueryParam( * name="name", * requirements="\w+", * strict=true, * nullable=false, * description="Some description" * ) * * @param ParamFetcher $paramFetcher * @return View */ public function getIndexAction(ParamFetcher $paramFetcher) { $view = View::create(); $result = [ 'status' => 'success', 'data' => [ 'someKey' => 'SomeValue' ] ]; $view->setData(['result' => $result]); return $view; }

Теперь вы можете разобраться, что мы там написали:

  1. @Get — это самый простой и быстрый способ переопределить URL-адрес маршрута для методов, которые отвечают только на один тип запроса (REST Full).

    Это даст нам возможность сделать postIndexAction deleteIndexAction — и так далее, мы поняли.

  2. @Templating — использовать его или нет — решать вам.

    Я предпочитаю использовать, например, для стандартизации ответов.

  3. @QueryParam — это первое преимущество: использование @QueryParam или @RequestParam соответственно позволит вам контролировать входные данные.

    Например, у нас есть поле имени, которое не может быть пустым, должно соответствовать шаблону \w+, и не менее важным является поле «Описание», в котором вы можете написать, для чего его следует использовать.

На этом вроде бы можно закончить, плюшку я описал и хватит, но нам еще нужна документация по этому чудо-методу, желательно информативная и читабельная.



* @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" * }, * }, * description = "Add here some description for this method", * requirements = { * {"name"="name", "datatype"="string", "requirements"="\w+", "description" = "description for this parameter"} * }, * cache=false, * tags = { * "stable" = "green", * "deprecated" = "#ff0000" * }, * deprecated = true, * section = "First section" * )

Начну с описания по порядку:

  1. @ApiDoc() — естественно, вначале мы укажем сам бандл для использования,
  2. statusCodes — назначение этого параметра понятно из его названия, но в конечном итоге в документации он выглядит очень красиво, он расскажет нам, что и в каких случаях мы можем получить в качестве ответа.

  3. описание - ну тоже вроде капитан пришёл, с той лишь разницей, что теперь он будет виден в документации.

  4. требования — здесь прописывается массив параметров Запроса/Запроса с описанием их требований, которое также будет отображаться в документации.

  5. теги — теги — это просто нечто.

    Когда к каждому методу можно поставить свой тег.

  6. deprecated — также хорошая функция, позволяющая отмечать методы, которые вы планируете больше не использовать.

  7. раздел — одно из самых полезных дополнений; он позволяет группировать методы, даже если они находятся в разных классах.

На этом я пожалуй закончу свой поверхностный обзор комплекта, приведя в доказательство скриншот того, что получилось в результате: Скриншот

Автоматическое создание документации API через аннотации или как подойти к документированию API

P.S> Поправил ссылку на скриншот Теги: #api #документация #аннотации #symfony 2 #nelmio-api-doc #php #symfony
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.