Swagger как документация к проекту Laravel

Работая в команде документация является довольно важной составляющей проекта. Все Back-end участники проекта должны документировать созданные маршруты.

Документация прекрасно поможет вспомнить и записать все параметры и ответы маршрутов:

  • Покажет Front-end разработчику как работать с маршрутом и какие у маршрута есть параметры и ответы
  • Поможет тестировщикам по время проведения тестирования
  • В случае чего напомнит Back-end разработчику как пользоваться маршрутом

Если вы работаете с Laravel и вам нужна документация по API со спецификацией OpenAPI, вы можете использовать этот пакет DarkaOnLine/L5-Swagger для создания документации по API.

Документация к проекту пишется прямо в коде у методов контроллера. После чего вызывается команда генерации документации (на основе кода).

Установка

Для установки потребуется пакетный менеджер composer, а также ввести данные команды:

composer require "darkaonline/l5-swagger"
php artisan vendor:publish --provider "L5Swagger\L5SwaggerServiceProvider"

А для генерации документации (сейчас там будет пусто, так как мы ничего не документировали) ввести:

php artisan l5-swagger:generate

Написание кода с документацией

На примере разберем способ описания документации в коде и генерацию её в файл для дальнейшего просмотра.

Давайте вставим общую информацию API с @OA\Info() нотацией. Мы можем вставить ее в файл /Http/Controllers/Controller.php вот так:

<?php

namespace App\Http\Controllers;

use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;

/**
 * @OA\Info(
 *    title="My Cool API",
 *    description="An API of cool stuffs",
 *    version="1.0.0",
 * )
 */

class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
}

Далее на методе регистрации можно описать все данные по маршруту:

/**
     * Register
     * @OA\Post (
     *     path="/api/register",
     *     tags={"Auth"},
     *     @OA\RequestBody(
     *         @OA\MediaType(
     *             mediaType="application/json",
     *             @OA\Schema(
     *                 @OA\Property(
     *                      type="object",
     *                      @OA\Property(
     *                          property="name",
     *                          type="string"
     *                      ),
     *                      @OA\Property(
     *                          property="email",
     *                          type="string"
     *                      ),
     *                      @OA\Property(
     *                          property="password",
     *                          type="string"
     *                      )
     *                 ),
     *                 example={
     *                     "name":"John",
     *                     "email":"john@test.com",
     *                     "password":"johnjohn1"
     *                }
     *             )
     *         )
     *      ),
     *      @OA\Response(
     *          response=200,
     *          description="Success",
     *          @OA\JsonContent(
     *              @OA\Property(property="meta", type="object",
     *                  @OA\Property(property="code", type="number", example=200),
     *                  @OA\Property(property="status", type="string", example="success"),
     *                  @OA\Property(property="message", type="string", example=null),
     *              ),
     *              @OA\Property(property="data", type="object",
     *                  @OA\Property(property="user", type="object",
     *                      @OA\Property(property="id", type="number", example=1),
     *                      @OA\Property(property="name", type="string", example="John"),
     *                      @OA\Property(property="email", type="string", example="john@test.com"),
     *                      @OA\Property(property="email_verified_at", type="string", example=null),
     *                      @OA\Property(property="updated_at", type="string", example="2022-06-28 06:06:17"),
     *                      @OA\Property(property="created_at", type="string", example="2022-06-28 06:06:17"),
     *                  ),
     *                  @OA\Property(property="access_token", type="object",
     *                      @OA\Property(property="token", type="string", example="randomtokenasfhajskfhajf398rureuuhfdshk"),
     *                      @OA\Property(property="type", type="string", example="Bearer"),
     *                      @OA\Property(property="expires_in", type="number", example=3600),
     *                  ),
     *              ),
     *          )
     *      ),
     *      @OA\Response(
     *          response=422,
     *          description="Validation error",
     *          @OA\JsonContent(
     *              @OA\Property(property="meta", type="object",
     *                  @OA\Property(property="code", type="number", example=422),
     *                  @OA\Property(property="status", type="string", example="error"),
     *                  @OA\Property(property="message", type="object",
     *                      @OA\Property(property="email", type="array", collectionFormat="multi",
     *                        @OA\Items(
     *                          type="string",
     *                          example="The email has already been taken.",
     *                          )
     *                      ),
     *                  ),
     *              ),
     *              @OA\Property(property="data", type="object", example={}),
     *          )
     *      )
     * )
     */
    public function register(Request $request)
    {
        // validate the incoming request
        // set every field as required
        // set email field so it only accept the valid email format

        $this->validate($request, [
            'name' => 'required|string|min:2|max:255',
            'email' => 'required|string|email:rfc,dns|max:255|unique:users',
            'password' => 'required|string|min:6|max:255',
        ]);

        // if the request valid, create user

        $user = $this->user::create([
            'name' => $request['name'],
            'email' => $request['email'],
            'password' => bcrypt($request['password']),
        ]);

        // login the user immediately and generate the token
        $token = auth()->login($user);

        // return the response as json 
        return response()->json([
            'meta' => [
                'code' => 200,
                'status' => 'success',
                'message' => 'User created successfully!',
            ],
            'data' => [
                'user' => $user,
                'access_token' => [
                    'token' => $token,
                    'type' => 'Bearer',
                    'expires_in' => auth()->factory()->getTTL() * 60,    // get token expires in seconds
                ],
            ],
        ]);
    }

Приведенная выше запись означает, что наша конечная точка (маршрут, endpoint) будет называться «Register».

  • @OA\Post — Указывает что это метод POST
  • path — Указывает путь
  • tags — Категория конечной точки
  • @OA\RequestBody — Для указания тела запроса (параметров)
  • @OA\Property — Указывает используемые параметры
  • @OA\Response — Для указания возможного ответа (их может быть несколько в зависимости от результата)

Генерация документации

Выполните следующую команду для создания документации:

php artisan l5:generate

Документация будет доступна по адресу:

  • /api/documentation
  • http://127.0.0.1/api/documentation
Запись опубликована в рубрике Laravel с метками , . Добавьте в закладки постоянную ссылку.

Добавить комментарий