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
86
Effortless API Documentation with Scribe
azuki
0
83
Laravelで手軽にAPIドキュメントを生成する ― Scribe活用術
azuki
0
55
🪝 便利な Property Hooks を 使ってみよう 🪝
azuki
0
90
決済システム超初心者が Stripe に入門している話
azuki
0
130
React Hook Form と Zod によるフォームバリデーション
azuki
0
77
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
SlackアプリとLambdaの 連携を構築した話
pawn_4_s
1
120
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
170
Claude Code全社展開のためにやったことn選~プラグイン302個・コミッター271人を支えるために~
kenchan
5
1.5k
20260722_microCMSで考える、AI時代のコンテンツ運用設計
yosh1
0
400
「寝てても仕事が進む」Claude Codeで組む第二の脳
tomoyafujita2016
0
330
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
260
ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolerance for Drifts (?)
akihisaikeda
1
190
Detecting Compromised CI with eBPF and Cilium Tetragon
lizrice
0
180
Building a Meta Ray-Ban display app
akkeylab
0
150
Foundation Models frameworkで画像分析
ryodeveloper
1
610
使いながら育てる Claude Code — 開発フローの1コマンド化 × 繰り返し指摘の自動仕組み化
shiki_kakaku
0
1.8k
php-fpmのプロセスが枯渇した日-調査・対処・そして本当にやるべきだったこと-
shibuchaaaan
0
290
Featured
See All Featured
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
390
The Curse of the Amulet
leimatthew05
2
14k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
380
Building the Perfect Custom Keyboard
takai
2
840
sira's awesome portfolio website redesign presentation
elsirapls
0
320
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
240
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
430
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.6k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
We Have a Design System, Now What?
morganepeng
55
8.3k
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
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠