Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Laravel や Symfony で手っ取り早く OpenAPI のドキュメントを作成する
Search
SAW
November 14, 2024
Programming
460
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
140
Effortless API Documentation with Scribe
azuki
0
110
Laravelで手軽にAPIドキュメントを生成する ― Scribe活用術
azuki
0
81
🪝 便利な Property Hooks を 使ってみよう 🪝
azuki
0
110
決済システム超初心者が Stripe に入門している話
azuki
0
190
React Hook Form と Zod によるフォームバリデーション
azuki
0
92
PHP で form-data を POST 以外のメソッドで受け取るには?
azuki
0
100
PHP で学ぶ OAuth 入門
azuki
2
1.5k
EditorConfig を使ってみよう
azuki
1
140
Other Decks in Programming
See All in Programming
Next.js: The final boss of Web Performance
guaca
0
340
GemmaをJevのように使ってみる / Use Gemma like Jev
kishida
5
840
エージェントを使い続けるためのメタワーク / Meta-work for keeping using the agent
rkaga
6
1.9k
SFCで実現する病院・医療システムの動的組み立て式UI
koukimiura
1
120
全ての永続トークンを、生まれる前に消し去りたい!
sylph01
2
1.4k
設計次第でAIコードの読む量は減らせる / designing-for-code-reading
minodriven
35
17k
Inertia Rails: The One-Person Framework with React & Friends
skryukov
0
120
Kotlinの15年とServer-Side Kotlin
n_takehata
1
170
dotNET_vulnclicker_intro.pdf
deka_morita
0
150
【加筆修正版】Laravel のアプリケーションをどこにデプロイするか #phpcon_ehime
akase244
0
160
学びを記事・スライド・Xへ高速展開する― AI-assisted Learning Loopで回すコンテンツ生成術
ochtum
0
150
npm との違いを手がかりにGo の依存管理を理解したい
optim
0
1.1k
Featured
See All Featured
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.7k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
330
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
4
4.4k
KATA
mclloyd
PRO
35
16k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
580
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
490
[RailsConf 2023] Rails as a piece of cake
palkan
59
7.1k
Speed Design
sergeychernyshev
33
2.2k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
590
Building AI with AI
inesmontani
PRO
1
1.3k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
59k
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
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠