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
実装と乖離させないスキーマ駆動開発フロー / OpenAPI Laravel編
Search
katzumi
June 18, 2023
Technology
300
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
実装と乖離させないスキーマ駆動開発フロー / OpenAPI Laravel編
katzumi
June 18, 2023
More Decks by katzumi
See All by katzumi
設計原則、アーキテクチャパターン、アーキテクチャスタイルの違いって何?いつどう向き合ったらいいの?を考えてみる
katzumi
0
300
『eg-r2』のご紹介
katzumi
0
49
runn開発者会議福岡2024
katzumi
0
47
リリース戦略を支えるCI/CDパ イプライン
katzumi
0
43
APIテストでもカバレッジ測定 したい!
katzumi
0
44
Slidevのテンプレートリポジトリについて
katzumi
0
170
OSSへの感謝を伝える
katzumi
0
710
モブワークを進化させていった話
katzumi
0
540
ActiveRecordパターンの呪縛を学びほぐして挑むクリーンアーキテクチャへの入り口
katzumi
0
75
Other Decks in Technology
See All in Technology
eBPF 簡介 2026 版
shunghsiyu
0
190
企画からFlutter実装まで、1つの機能を一貫して開発したプロセスと成果物
khiroyuki1003
1
160
Metadata - Section 3 : Dublin Core Standard · DC
mohab1
0
110
ゼロから作るWebアプリの新定番!?Amplify Gen 2 × AWS Blocksで実現する「開発速度とRDBの柔軟性のいいとこ取り」
amixedcolor
1
160
Autonomous AI Lakehouse - Live AI Hubから始めるセキュアなAIデータ活用 -
oracle4engineer
PRO
3
190
Technical Project Manager の役割とやりがい、少しだけ AI
yoshiiryo1
0
600
複雑な業務システムを高速でつくるため、チーム全員をつくれる人へ
ayakurabuchi
0
140
2026 Apache Flink Community Checkpoint
rmetzger
0
190
`go get`したらELFが降ってきた件
taiyow
0
180
コードレビューをなくして見えたもの
henteko
0
140
攻撃 3 時間 vs 復旧 10 時間。アクセスキー流出の非対称性を体感するために CTF を作った話
kazzpapa3
1
150
Sinatra on PicoRuby ローカルでセルフホスト
bash0c7
0
100
Featured
See All Featured
The SEO identity crisis: Don't let AI make you average
varn
0
630
Fashionably flexible responsive web design (full day workshop)
malarkey
409
67k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.6k
Design in an AI World
tapps
1
380
The Mindset for Success: Future Career Progression
greggifford
PRO
0
560
Become a Pro
speakerdeck
PRO
31
6.4k
Typedesign – Prime Four
hannesfritz
42
3.2k
The Curious Case for Waylosing
cassininazir
1
610
Balancing Empowerment & Direction
lara
6
1.4k
Paper Plane (Part 1)
katiecoart
PRO
2
12k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
550
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
Transcript
実装と乖離させないスキーマ駆 動開発フロー / OpenAPI Laravel 編 Press Space for next
page (非公式)PHP Conference Fukuoka After Hack!! June 25, 2023. v0.0.21
自己紹介 以下のアカウントで活動しています katzumiと申します katzchum k2tzumi katzumi
スキーマ駆動開発のフローってどうやっていますか? 本LTではクライアント(フロントエンド)の実装はさておいて、主にAPI(バックエンド)の実装についてお 話します。
スキーマ駆動開発のフローってどうやっていますか? ドキュメント(スキーマ定義の仕様書)が先? 本LTではクライアント(フロントエンド)の実装はさておいて、主にAPI(バックエンド)の実装についてお 話します。
スキーマ駆動開発のフローってどうやっていますか? ドキュメント(スキーマ定義の仕様書)が先? APIの実装(コード)が先? 本LTではクライアント(フロントエンド)の実装はさておいて、主にAPI(バックエンド)の実装についてお 話します。
問題点 スキーマ定義(ドキュメント)と実際の実装(コード)が乖離してしまう
なぜ乖離が発生するのか? ドキュメントが先の場合(コードが先であっても。。)
なぜ乖離が発生するのか? コード生成 実装 Open API Spec Stub コード 実際のコード ドキュメントが先の場合(コードが先であっても。。)
なぜ乖離が発生するのか? コード生成 実装 変更 ❌ 変更済みのStub を反映することはできない Open API Spec
Stub コード 実際のコード * ドキュメントが先の場合(コードが先であっても。。)
なぜ乖離が発生するのか? コード生成 実装 変更 ❌ 変更済みのStub を反映することはできない 変更 ❌ 定義が間違っていても自動反映はされない
Open API Spec Stub コード 実際のコード * * ドキュメントが先の場合(コードが先であっても。。)
なぜ乖離が発生するのか? ドキュメントが先の場合(コードが先であっても。。)
なぜ乖離が発生するのか? ドキュメントが先の場合(コードが先であっても。。)
なぜ乖離が発生するのか? ドキュメントが先の場合(コードが先であっても。。)
つらい、、
なぜ?
スキーマとコードとの距離が離れてしまっている コード生成 実装 ココ!! Open API Spec Stub コード 実際のコード
独立したものになっていて、乖離が発生したことを見落としがち
どうすれば距離が縮まるか?
スキーマ定義をコードに埋め込むという方法 swagger-php のAttributeを使ってスキーマを定義する Controller <?php use OpenApi\Attributes as OA; #[OA\Info(title:
"My First API", version: "0.1")] class OpenApi {} class MyController { #[OA\Get(path: '/api/data.json')] #[OA\Response(response: '200', description: 'The data')] public function getResource() { // ... } } Request <?php use OpenApi\Attributes as OA; use Illuminate\Foundation\Http\FormRequest; #[OA\Schema(schema: 'CreateUserRequest', title: ' ユーザー生成のリクエ class CreateUserRequest extends FromRequest { use BaseRequestTrait; #[OA\Property('username', description: ' ユーザー名', type: 'string', maxLength: 100, pattern: '^[a-zA-Z\d]{4,100}', example: 'scott', nullable: false)] public string $username; #[OA\Property('email', description: ' メールアドレス', type: 'string', maxLength: 320, pattern: '^[a-zA-Z0-9_.+-]+@([a-zA-Z0-9][a-zA-Z0-9-]*[a-zA- example: '
[email protected]
',nullable: false)] public string $email;
レビューしやすい 視点移動が少なくて済む
絶対スキーマから乖離させないマン Attributeや実際に出力されたスキーマファイルを活用してスキーマとコードを乖離させない仕組み
Attributeの力を引き出してみる!
Arttibuteはコードの一部! ReflectionClassを使ってArttibuteを読み出してゴニョゴニョする
Arttibuteはコードの一部! 生成 実際のコード Attribute 定義 Attribute 定義 Attribute 定義 Controller
クラス Request クラス Response クラス スキーマファイル ReflectionClassを使ってArttibuteを読み出してゴニョゴニョする
Arttibuteはコードの一部! 生成 ズレが発生しない 実際のコード Attribute 定義 Attribute 定義 Attribute 定義
実行時評価 自動生成 Controller クラス Request クラス Response クラス Validation ルール Route ファイル スキーマファイル ReflectionClassを使ってArttibuteを読み出してゴニョゴニョする
Arttibuteはコードの一部! 生成 ズレが発生しない 実際のコード Attribute 定義 Attribute 定義 Attribute 定義
実行時評価 自動生成 Controller クラス Request クラス Response クラス Validation ルール Route ファイル スキーマファイル ReflectionClassを使ってArttibuteを読み出してゴニョゴニョする
スキーマ自体も静的解析すべし! OpenAPI Spec 表示 生成 静的解析 整形 require スキーマファイル spectral
Redoc 実際のコード Attribute 定義 Attribute 定義 Attribute 定義 実行時評価 自動生成 Controller クラス Request クラス Response クラス Validation ルール Route ファイル swagger-php(L5-Swagger) swagge-ui
リクエスト・レスポンスの正確性を保証させる 生成 参照(リクエスト・レスポンスValidation ) テスト実行 Test コード Use laravel-openapi-validator Controller
テスト(PHPUnit) 実際のコード 自動生成 実行時評価 Route ファイル Controller クラス Request クラス Validation ルール Response クラス スキーマファイル Controllerテストで laravel-openapi-validator を利用してリクエストとレスポンスを検証
より確実にE2Eで検証 生成 参照(リクエスト・レスポンスValidation ) テスト実行 Test コード API シナリオテスト(runn) 実際のコード
自動生成 実行時評価 Route ファイル Controller クラス Request クラス Validation ルール Response クラス スキーマファイル APIシナリオテスト( runn )でユースケースを網羅的に検証
まとめ
スキーマ≠ドキュメント スキーマはコードの一部。ドキュメンテーションツールからSpecを自動生成
スキーマをいつ書くか? コードを書いたら勝手にスキーマ定義がいい感じに出力されている状態
スキーマ自体もテストが必要 静的解析して最低限の品質を確保 テストでの検証にも利用してスキーマを含んだAPI自体の品質も向上させる
参考URL 実装と乖離させないスキーマ駆動開発フロー / OpenAPI Laravel編 https://zenn.dev/katzumi/articles/schema-driven-development-flow swagger-php https://github.com/zircote/swagger-php spectral https://github.com/stoplightio/spectral
laravel-openapi-validator https://github.com/kirschbaum-development/laravel-openapi-validator runn https://github.com/k1LoW/runn
ご清聴ありがとうございます