Yii2. Приклад документування API за допомогою Swagger

23 серпня 2024 р. 44 egor

Yii2 і Swagger. Автогенерована документація в Yii2 за допомогою Swagger на основі анотацій у коді.

Крок 1. Встановлюємо необхідні бібліотеки

Встановлюємо бібліотеку zircote/swagger-php за допомогою composer

composer require --dev zircote/swagger-php

Завантажуємо https://github.com/swagger-api/swagger-ui та розпаковуємо вміст папки dist до папки де буде знаходитися документація, наприклад web/api-doc.

Додаємо анотації до екшенів. Приклад є в документації та прикладах (папки docs та examples) https://github.com/zircote/swagger-php . Це можна зробити і пізніше, але тоді документація буде порожня.

Приклад анотації:

/**
  * @OA\Info(title="My First API", version="0.1")
  */

Крок 2. Створюємо дію генерації документації на основі анотацій для Swagger

Створюємо контролер Swagger, для генерації документації (controllers/SwaggerController):

<?php

namespace app\controllers;

use yii\console\Controller;
use Yii;
use function OpenApi\scan;

class SwaggerController extends Controller
{

    public function actionGo()
    {
        $openApi = scan(Yii::getAlias('@app/modules/api/controllers'));
        $file = Yii::getAlias('@app/web/api-doc/swagger.yaml');
        $handle = fopen($file, 'wb');
        fwrite($handle, $openApi->toYaml());
        fclose($handle);
        return ;
    }

}

Де scan(Yii::getAlias('@app/modules/api/controllers')) - папка з кодом та анотаціями для документування, тут ми вказали тільки один модуль для документування.

$file = Yii::getAlias('@app/web/api-doc/swagger.yaml'); - папка, в яку було скопійовано swagger-ui/dist (у прикладі це: web/api-doc).

Або створюємо консольну дію: (commands/SwaggerController):

<?php

namespace app\commands;

use yii\console\Controller;
use Yii;
use yii\console\ExitCode;
use yii\helpers\Console;
use function OpenApi\scan;

class SwaggerController extends Controller
{

    public function actionGo()
    {
        $openApi = scan('@app/modules/api/controllers');
        $file = Yii::getAlias('@web/api-doc/swagger.yaml');
        $handle = fopen($file, 'wb');
        fwrite($handle, $openApi->toYaml());
        fclose($handle);
        echo $this->ansiFormat('Created \n", Console::FG_BLUE');
        return ExitCode::OK;
    }

}

Запускаємо через консоль

php yii swagger/go

Крок 3. Зміна налаштувань для Swagger

Далі відкриваємо файл index.html у папці з документацією (у прикладі @app/web/api-doc/) І змінюємо параметр url з "https://petstore.swagger.io/v2/swagger.json" ( url: "https://petstore.swagger.io/v2/swagger.json", ), на "swagger.yaml" ( url: "swagger.yaml", ).

Після запуску генерації документації, вона буде доступна за адресою http://site/api-doc (Адреса може залежати від ваших налаштувань .htacces, nginx, ...)

Якщо ви використовуєте .htaccess із прикладів кодер.укр, то додайте рядок до кореневого .htaccess:

RewriteRule ^api-doc/(.*)$ web/api-doc/$1 [L]