Laravel 8 установка OpenAPI (Swagger)
Установка
Библиотека находится на гите. Там перейдите в Installation & Configuration и выберете свою версию ларки. Затем через консоль введи выбранную команду.
composer require "darkaonline/l5-swagger"
если появилась ошибка:
Your requirements could not be resolved to an installable set of packages.
Problem 1
– Root composer.json requires php ^8.0 but your php version (7.4.20) does not satisfy that requirement.
Problem 2
– psr/log 2.0.0 requires php >=8.0.0 -> your php version (7.4.20) does not satisfy that requirement.
– laravel/framework v8.70.2 requires psr/log ^1.0 || ^2.0 -> satisfiable by psr/log[2.0.0].
– laravel/framework is locked to version v8.70.2 and an update of this package was not requested.Installation failed, reverting ./composer.json and ./composer.lock to their original content.
Загляните в свой composer.json и выставите:
"require": {
"php": "^7.3|^8.0",
Затем обновите composer update. После чего пробуйте снова установить пакет.
Затем пропишите в файле config/app ->
'providers' => [
L5Swagger\L5SwaggerServiceProvider::class
И введите в консоли команду:
php artisan vendor:publish --provider "L5Swagger\L5SwaggerServiceProvider"
Настройка
Переходим в config/l5-swagger.php
Ищем блок в самом низу “Uncomment to add constants which can be used in annotations”.
'constants' => [
'L5_SWAGGER_CONST_HOST' => env('L5_SWAGGER_CONST_HOST', 'http://my-default-host.com'),
'L5_SWAGGER_CONST_HOST_V2' => env('L5_SWAGGER_CONST_HOST_V2', 'http://my-default-host.com'),
'L5_SWAGGER_CONST_EMAIL' => env('MAIL_FROM_ADDRESS', 'no-reply@example.com'),
],
Первая и вторая строчка отвечает за разные версии API. Третья строка нужна для email адреса. Теперь откроем файл .env
Кофигурация
Первоначально нужно описать стандартный контролер. Открываем app/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;
class Controller extends BaseController
{
/**
* @OA\Info(
* version="1.0.0",
* title="OpenApi Documentation",
* description="Документация для микро сервиса",
* @OA\Contact(
* email=L5_SWAGGER_CONST_EMAIL
* )
* )
*
* @OA\Server(
* url=L5_SWAGGER_CONST_HOST,
* description="Основной API"
* )
* @OA\Server(
* url=L5_SWAGGER_CONST_HOST_V2,
* description="Для Логирования"
* )
*
* @OA\Tag(
* name="Channels",
* description="Работа с каналами"
* )
*/
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
}
Описываем модель, в моем случае она называется Channel.
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
/**
* @OA\Schema(
* title="Channel",
* description="Channel model",
* @OA\Xml(
* name="Channel"
* )
* )
*/
class Channel extends Model
{
/**
* @OA\Property(
* title="ID",
* description="ID",
* format="int64",
* example=1
* )
*
* @var bigInteger
*/
private $id;
/**
* @OA\Property(
* title="Alias",
* description="Псевдоним канала",
* example="email"
* )
*
* @var string
*/
private $alias;
/**
* @OA\Property(
* title="Name",
* description="Название канала",
* example="E-mail"
* )
*
* @var string
*/
private $name;
/**
* @OA\Property(
* title="Is Active",
* description="Активный канала",
* example="true"
* )
*
* @var boolean
*/
private $is_active;
/**
* @OA\Property(
* title="Default Driver Alias",
* description="Драйвер по умолчанию на этом канале",
* example="mailtrap"h
* )
*
* @var string
*/
private $default_driver_alias;
/**
* @OA\Property(
* title="Created at",
* description="Created at",
* example="2020-01-27 17:50:45",
* format="datetime",
* type="string"
* )
*/
private $created_at;
/**
* @OA\Property(
* title="Updated at",
* description="Updated at",
* example="2020-01-27 17:50:45",
* format="datetime",
* type="string"
* )
*/
private $updated_at;
protected $table = 'channels';
}
Описываем контроллер, в моем случаи ChannelController.
namespace App\Http\Controllers;
class ChannelController extends Controller
{
/**
* @OA\Get(
* path="/channels/{alias}",
* operationId="getListAvailableChannel",
* tags={"Channels"},
* summary="Получение списка доступных драйверов для канала",
* description="Метод возвращает данные ...",
* @OA\Parameter(
* name="alias",
* description="Alias канала (email)",
* required=true,
* in="path",
* @OA\Schema(
* type="string"
* )
* ),
* @OA\Response(
* response=200,
* description="Successful operation",
* @OA\JsonContent(ref="#/components/schemas/Channel")
* ),
* )
*/
public function getListAvailableChannel()
{
//...
}
/**
* * @OA\Get(
* path="/channels/",
* operationId="getChannels",
* tags={"Channels"},
* summary="Получить список всех доступных каналов",
* description="Получаем список всех доступных каналов",
* @OA\Response(
* response=200,
* description="successful operation",
* @OA\JsonContent(ref="#/components/schemas/Channel")
* ),
* @OA\Response(
* response=400,-n
* description="Invalid ID supplied"
* )
* )
*/
public function getChannels()
{
//...
}
}
НУ, а теперь запускаем эту команду в консоли и переходим по адресу /api/documentation
php artisan l5-swagger:generate
Возможно у вас как и у меня при запуске /api/documentation, откроется пустая страница, если нажать на странице F12 и перейти в консоль то вы увидите ошибки, которые сообщают, что не смог загрузить скрипты, т.к. их нет. Для решения этой проблемны переходим в public и создаем руками каталог public/docs/asset.
Затем переходим \vendor\swagger-api\swagger-ui\dist и все из нее копируем в ранее созданную папку.
Предыдущая








Все сделал, при открытии страницы ошибка:
Unable to render this definition
The provided definition does not specify a valid version field.
Please indicate a valid Swagger or OpenAPI version field. Supported version fields are swagger: “2.0” and those that match openapi: 3.0.n (for example, openapi: 3.0.0).
Так вам же пишет, что у вас версия swagger не та storage/api-docs/api-docs.json измените там