Работая в команде документация является довольно важной составляющей проекта. Все 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
— Указывает что это метод POSTpath
— Указывает путьtags
— Категория конечной точки@OA\RequestBody
— Для указания тела запроса (параметров)@OA\Property
— Указывает используемые параметры@OA\Response
— Для указания возможного ответа (их может быть несколько в зависимости от результата)
Генерация документации
Выполните следующую команду для создания документации:
php artisan l5:generate
Документация будет доступна по адресу:
/api/documentation
http://127.0.0.1/api/documentation