Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Laravel や Symfony で手っ取り早く OpenAPI のドキュメントを作成する
Search
SAW
November 14, 2024
Programming
450
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Laravel や Symfony で手っ取り早く OpenAPI のドキュメントを作成する
第40回関西PHP勉強会 の発表資料です。
SAW
November 14, 2024
More Decks by SAW
See All by SAW
Makefile 入門
azuki
0
93
Effortless API Documentation with Scribe
azuki
0
89
Laravelで手軽にAPIドキュメントを生成する ― Scribe活用術
azuki
0
57
🪝 便利な Property Hooks を 使ってみよう 🪝
azuki
0
96
決済システム超初心者が Stripe に入門している話
azuki
0
140
React Hook Form と Zod によるフォームバリデーション
azuki
0
78
PHP で form-data を POST 以外のメソッドで受け取るには?
azuki
0
90
PHP で学ぶ OAuth 入門
azuki
2
1.4k
EditorConfig を使ってみよう
azuki
1
130
Other Decks in Programming
See All in Programming
Japan Community Day at Kubecon + CloudNativeCon Japan 2026: Learning Container Privilege Control by Building My Own Low-Level Container Runtime
ternbusty
1
170
KotlinConf Extended South Korea 2026 Keynote
l2hyunwoo
0
120
AIと壁打ちしながら進めるコスト管理
fufuhu
2
1.7k
Discordを用いたラボオートメーション関連情報収集の自動化
noguhiro2002
0
440
ソフトウェアエンジニアにとっての生成AI - 特性を知って使い倒す / generative ai for software enginner
kishida
7
2.1k
Detecting Compromised CI with eBPF and Cilium Tetragon
lizrice
0
260
Jindong: Introducing Declarative Haptics in Compose Multiplatform
l2hyunwoo
0
130
go-spidermonkeyでAIエージェントのCode Modeを実装する
syumai
2
1.2k
AI時代に学ぶ 好きなルール 嫌いなルール Linter編
shorty5121
0
150
Hono + Inertia + React で LP を構築した話
oukayuka
2
160
ソフトウェアラスタライザ
fadis
1
660
Flow は今どうなっているか
mizdra
PRO
0
710
Featured
See All Featured
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.5k
The Spectacular Lies of Maps
axbom
PRO
1
940
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
440
Music & Morning Musume
bryan
47
7.3k
Embracing the Ebb and Flow
colly
88
5.1k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
The SEO Collaboration Effect
kristinabergwall1
1
530
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
260
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.1k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.6k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Transcript
-BSBWFM4ZNGPOZͰखͬऔΓૣ͘ 0QFO"1*ͷυΩϡϝϯτΛ࡞͢Δ ୈճؔ1)1ษڧձ 4"8
$(whoami) ࢯ໊Ճ౻फҰ ࡀ ϋϯυϧωʔϜ4"8 9 چ5XJUUFS !B[VLJ@FBUFS ؔͷ*5ΤϯδχΞίϛϡχςΟͷ͔͠୲ ࣗশ
େࡕࡏॅɾѪग़ ಘҙ8FCΞϓϦέʔγϣϯ։ൃ -BSBWFM 7VF ྉཧͷՃ࣌ؒΛॖ͢ΔͨΊʹ ڧՐͰௐཧͨ͜͠ͱ͕͋Δͷ ͚ࣗͩͰͳ͍ͣ ࠓͷ໎ݴ
͋ͳͨͷϓϩδΣΫτͰ "1*υΩϡϝϯτ ଘࡏ͍ͯ͠·͔͢
ͦͷ"1*υΩϡϝϯτ ӕΛ͍͍ͭͯͨΓ͠·ͤΜ͔
"1*༷ॻͱ࣮͕ဃ͢Δཧ༝ ʮղऍͷ༨ͷ͋Δ༷ॻʯ ྫ࣌ࠁͷදݱܗ͕ࣜᐆດ ాݑଠ !,FOUBSPV5BLFEB ͞Μ ʮ-BSBWFM0QFO"1*ʹΑΔਏ͘ͳ͍εΩʔϚۦಈ։ൃʯ QΑΓҾ༻ ʮ༷ॻͷԽʹա͗ͳ͍࣮ʯ ਓ͕ؒख࡞ۀͰ࣮͢Δͱϛε͕ൃੜ͠͏Δ
ాݑଠ !,FOUBSPV5BLFEB ͞Μ ʮ-BSBWFM0QFO"1*ʹΑΔਏ͘ͳ͍εΩʔϚۦಈ։ൃʯ QQΑΓҾ༻
0QFO"1*ͱ 3&45"1*ͷ༷ॻΛදݱ͢ΔͨΊͷඪ४Խن֨ "1*ͷΠϯλϑΣʔεΛఆٛ ਓ͚ؒͩͰͳ͘ίϯϐϡʔλ༷ΛཧղՄೳ ᐆດͳදݱΛഉআͯ͠ղऍͷ༨Λͳ͘͢ "1*༷ॻ:".- +40/ܗࣜͰදه 0QFO"1*ʹରԠͨ͠πʔϧ͕"1*༷Λղऍͯ͠ར༻Մೳ ίϯϐϡʔλ͕ղऍͰ͖ΔΑ͏ʹϑΥʔϚοτ͕ఆΊΒΕ͍ͯΔ 0QFO"1*"1*༷ॻͷͨΊͷهड़ݴޠͱߟ͑ΒΕΔ
0QFO"1*ͷ༷ॻͷྫ :".-ܗࣜ openapi: 3.0.0 info: title: Sample description: 'Sample
API' version: 1.0.0 paths: '/api/hoge/{id}': get: parameters: - name: id in: path description: 'ID of hoge' required: true schema: type: string responses: 200: description: 'hoge response body' content: application/json: schema: properties: id: type: integer message: type: string type: object
0QFO"1*͕͋Ε ༷ॻͷ՝ղফͰ͖Δ͔
0QFO"1*୯ମͰ࣮ͱͷဃղܾ͠ͳ͍ ࣮͕มߋ͞ΕͨΒ0QFO"1*ͷϑΝΠϧมߋ͕ඞཁ υΩϡϝϯτͷมߋ࿙ΕޡͬͨมߋʹΑ࣮ͬͯͱͷဃ͕ੜ͡ΔՄೳੑ͕͋Δ ن͕େ͖͍:".-+40/ਓ͕ؒಡΈॻ͖͢Δʹਏ͍ ༷ͷԽͰ͋Δ͜ͱʹมΘΓͳ͍ ࣮0QFO"1*ͷ༰Λॻ͖ͨ͠ͷʹա͗ͳ͍ 0QFO"1*ΛղऍՄೳͳςετπʔϧͰ༷ͱ࣮ͷဃͷݕग़Մೳ
࣮͔Β0QFO"1*υΩϡϝϯτΛੜ͢Δ "1*ͷ࣮͔Β0QFO"1*υΩϡϝϯτΛࣗಈੜ ϝϦοτʮ༷ͱ࣮ͱΛҰக͍ͤ͢͞ʯ ాݑଠ !,FOUBSPV5BLFEB ͞Μ ʮ-BSBWFM0QFO"1*ʹΑΔਏ͘ͳ͍εΩʔϚۦಈ։ൃʯQΑΓҾ༻ 1)1ͷ0QFO"1*υΩϡϝϯτΛੜ͢ΔϥΠϒϥϦ 4ZNGPOZ/FMNJP0QFO"QJ#VOEMF -BSBWFM-4XBHHFS
/FMNJP0QFO"QJ#VOEMF 1)1ͷΞτϦϏϡʔτΛར༻ͯ͠هड़ 4ZNGPOZͷ#[Route()]͔Β"1*ͷ63-Λදݱ #[OpenApi\Attributes\Response()]ͰϨεϙϯεͷใΛදݱ 4XBHHFS6*ͷϖʔδΛࣗಈతʹੜ 4XBHHFS6*ͷϖʔδΛੜ͢ΔͨΊͷίϚϯυͷ࣮ߦ͕ෆཁ 4XBHHFS6*ͷϖʔδʹΞΫηε͢Δ͚ͩͰྑ͍ 4XBHHFS6*Λར༻͢ΔͨΊʹผ్ґଘύοέʔδͷΠϯετʔϧ͕ඞཁ
/FMNJP0QFO"QJ#VOEMFͷΠϯετʔϧͱ࣮ྫ # NelmioOpenApiBundle のインストール composer require nelmio/api-doc-bundle # Swagger
UI に必要な依存パッケージのインストール composer require symfony/twig symfony/asset /FMNJP0QFO"QJ#VOEMFͷΠϯετʔϧखॱ use OpenApi\Attributes as OA; class SampleController extends AbstractController { #[Route('/hoge/{id}', methods: ['GET'])] #[OA\Response( response: 200, description: 'Get specified hoge data', content: new OA\JsonContent( ref: new Model(type: Hoge::class), ) )] public function get(int $id): JsonRespnose { // 略 } } ࣮ྫ app.swagger_ui: path: /api/doc method: GET defaults: { _controller: nelmio_api_doc.controller.swagger_ui } 4XBHHFS6*Λ༗ޮԽ͢Δઃఆͷྫ config/routes/nelmio_api_doc.yaml
/FMNJP0QFO"QJ#VOEMFͰͷ4XBHHFS6*ͷදࣔྫ
-4XBHHFS 1)1ͷΞτϦϏϡʔτΛར༻ͯ͠هड़ #[OpenApi\Attributes\Get()]#[OpenApi\Post()]ͳͲͰ63-Ϩεϙϯεͷ ใΛදݱ 4XBHHFS6*Λར༻͢ΔͨΊʹՃͷύοέʔδͷΠϯετʔϧ͕ෆཁ ެࣜυΩϡϝϯτͷใ͕ෆ (JU)VCͷ8JLJ͕-4XBHHFSͷυΩϡϝϯτ ࣮ྫ1)1%PDͷΞϊςʔγϣϯͷΈ ΑΓৄࡉͳϦϑΝϨϯε͕ඞཁͳ߹4XBHHFS1)1ͷυΩϡϝϯτΛࢀর
-4XBHHFSͷΠϯετʔϧͱ࣮ྫ # L5 Swagger のインストール composer require darkaonline/l5-swagger -4XBHHFSͷΠϯετʔϧखॱ
use OpenApi\Attributes as OA; class SampleController extends Controller { #[OA\Get( path: '/api/hoge/{id}', summary: 'Get specified hoge data', responses: [ new OA\Response( response: Response::HTTP_OK, description: 'hoge response body', ), ) )] public function get(int $id): JsonRespnose { // 略 } ࣮ྫ # ServiceProvider の登録 php artisan vendor:publish --provider \ "L5Swagger\L5SwaggerServiceProvider" # Swagger UI の 生 成 php artisan l5-swagger:generate -4XBHHFSͷઃఆͱυΩϡϝϯτੜ
-4XBHHFSͰͷ4XBHHFS6*ͷදࣔྫ
૯ׅ 0QFO"1*ʹ͍ͭͯઆ໌ ίʔυ͔Β0QFO"1*υΩϡϝϯτΛࣗಈੜ͢Δํ๏Λհ 4ZNGPOZ/FMNJP"QJ%PD#VOEMFS -BSBWFM-4XBHHFS
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠