Laravel

[Laravel] Swagger API 적용 하기

먹세 2021. 11. 11. 11:38

1. zircote/swagger-php 설치

composer require zircote/swagger-php

//버전 지정
composer require zircote/swagger-php:3.3.2

- 삭제

composer remove zircote/swagger-php

 

 

2. Controller 등 API 작성 메소드 위에 애노테이션으로 기술하기

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

/**
 * @OA\Get(
 *     path="/api/resource.json",
 *     @OA\Response(response="200", description="An example resource")
 * )
 */

 

-상세설명 (회원 등록 샘플)

/**
 * @OA\Post (
 *     path="/user",
 *     tags={"회원"},
 *     summary="회원 등록",
 *     description="회원 정보를 등록함",
 *     security={
 *         {"bearerAuth": {}}
 *     },
 *     operationId="UserController::userStore",
 *     @OA\Parameter(
 *          name="id",
 *          description="회원 번호",
 *          in="path",
 *          required=true,
 *          example="1",
 *          @OA\Schema(type="int")
 *     ),
 *     @OA\Parameter(
 *          name="name",
 *          description="회원 이름",
 *          in="path",
 *          required=true,
 *          example="홍길동",
 *          @OA\Schema(type="string")
 *     ),
 *     @OA\Parameter(
 *          name="phone",
 *          description="회원 전화번호",
 *          in="path",
 *          required=true,
 *          example="010-1234-1234",
 *          @OA\Schema(type="string")
 *     ),
 *     @OA\Response(
 *          response="200",
 *          description="성공",
 *          @OA\MediaType(
 *              mediaType="application/json",
 *              @OA\Schema(
 *                  allOf={
 *                      @OA\Schema(ref="#/components/schemas/UserController-userStore")
 *                  }
 *              )
 *          )
 *     ),
 *     @OA\Response(
 *          response="401",
 *          description="실패",
 *              @OA\MediaType(
 *                  mediaType="application/json",
 *                  @OA\Schema(
 *                      @OA\Property(property="result", type="string", description="결과코드", example="401"),
 *                      @OA\Property(property="message", type="string", description="메시지", example="조회오류"),
 *                  )
 *              )
 *     ),
 *     @OA\RequestBody(
 *         @OA\MediaType(
 *             mediaType="application/json",
 *             @OA\Schema(
 *                  @OA\Property(property="id", type="int", description="회원 번호", example=1),
 *                  @OA\Property(property="name", type="string", description="회원 이름", example="홍길동"),
 *                  @OA\Property(property="phone", type="string", description="회원 전화번호", example="010-1234-1234"),
 *             )
 *         )
 *     )
 * )
 *
 * @OA\Schema(
 *      schema="UserController-userStore",
 *          @OA\Property(property="result", type="string", description="결과코드", example="200"),
 *          @OA\Property(property="message", type="string", description="메시지", example="회원이 입력 되었습니다."),
 *          @OA\Property(property="userInfo", type="array",
 *              @OA\Property(property="id", type="int", description="회원 아이디", example=1),
 *              @OA\Property(property="name", type="string", description="회원 이름", example="홍길동"),
 *              @OA\Property(property="phone", type="string", description="회원 전화번호", example="010-1234-1234"),
 *          ),
 *      ),
 */

 

- 기본적으로 json 형태로 기술된다.

- array도 만들수는 있지만, 리스트 형태로는 작성되지 않는다. [1,2,3,4] 형태 x 

 

- 배열 사용 예

* @OA\Schema(
*      schema="UserController-userStore",
*          @OA\Property(property="result", type="string", description="결과코드", example="200"),
*          @OA\Property(property="message", type="string", description="메시지", example="회원이 입력 되었습니다."),
*          @OA\Property(property="userInfo", type="array",
*              @OA\Items(
*                  @OA\Property(property="1", type="int", description="회원 아이디", example=1),
*                  @OA\Property(property="2", type="string", description="회원 이름", example="홍길동"),
*                  @OA\Property(property="3", type="string", description="회원 전화번호", example="010-1234-1234"),
*              ),
*          ),
*      ),
*/

type="array" 로 작성하고, Items 로 기술한다.

 

- Schema 여러개 사용하기

*     @OA\Response(
*          response="200",
*          description="성공",
*          @OA\MediaType(
*              mediaType="application/json",
*              @OA\Schema(
*                  allOf={
*                      @OA\Schema(
*                          @OA\Property(property="result", type="string", description="결과코드", example="200"),
*                          @OA\Property(property="message", type="string", description="메시지", example="성공")
*                      ),
*                      @OA\Schema(ref="#/components/schemas/UserController-Info")
*                  }
*              )
*          )
*     ),

위 처럼 schema 에 property를 직접 기술 하고, 그 아래에 ref로 schema를 불러와서 같이 사용 가능

 

 

3. 기술한 내용들을 swagger api 문서로 생성하기

프로젝트 폴더로 이동하여 openapi 명령어로 실행

# ./vendor/bin/openapi -o swagger-ui/swagger.json --format json ./app

openapi 를 실행해서 json 포맷으로 ./app 폴더 내에 있는 모든 애노테이션들을 찾아서 자동으로 문서를 생성해줘라 라는 의미

 

- 결과

 

 

4. zircote/swagger-php

https://github.com/zircote/swagger-php

 

GitHub - zircote/swagger-php: A php swagger annotation and parsing library

A php swagger annotation and parsing library. Contribute to zircote/swagger-php development by creating an account on GitHub.

github.com

 

반응형