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
61
Effortless API Documentation with Scribe
azuki
0
77
Laravelで手軽にAPIドキュメントを生成する ― Scribe活用術
azuki
0
48
🪝 便利な Property Hooks を 使ってみよう 🪝
azuki
0
87
決済システム超初心者が Stripe に入門している話
azuki
0
120
React Hook Form と Zod によるフォームバリデーション
azuki
0
75
PHP で form-data を POST 以外のメソッドで受け取るには?
azuki
0
86
PHP で学ぶ OAuth 入門
azuki
2
1.4k
EditorConfig を使ってみよう
azuki
1
120
Other Decks in Programming
See All in Programming
才能?センス?知らん、 続けたもん勝ちだ。-- 結婚・出産・癌を越えてなお、私がプロダクトを創り続ける理由
16bitidol
2
840
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
1
480
技術記事、 専門家としてのプログラマ、 言語化
mizchi
14
7.4k
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
0
100
Contextとはなにか
chiroruxx
1
390
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
840
act1-costs.pdf
sumedhbala
0
210
霧の中の代数的エフェクト
funnyycat
1
340
任せる範囲はこう広がった / How the Scope of AI Delegation Has Expanded
nrslib
1
250
1B+ /day規模のログを管理する技術
broadleaf
0
130
SLOをサービス品質の共通言語にするために 取り組んできたこと
wakana0222
0
480
フィードバックで育てるAI開発
kotaminato
1
110
Featured
See All Featured
Documentation Writing (for coders)
carmenintech
77
5.4k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
290
Building Adaptive Systems
keathley
44
3.1k
Darren the Foodie - Storyboard
khoart
PRO
3
3.4k
We Are The Robots
honzajavorek
0
270
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2k
Amusing Abliteration
ianozsvald
1
220
Designing Powerful Visuals for Engaging Learning
tmiket
1
450
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
270
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
310
How to Talk to Developers About Accessibility
jct
2
340
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
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠