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
42
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
Sizing, Benchmarking and Performance Tuning Apache Flink Clusters
rmetzger
0
110
新卒エンジニア、 介護士になる
ryu1013
1
690
公共システムAdventCalendar2026
toru_kubota
0
200
デザインレビューは自動化できるのか?─ Flutter × Figma で UI 品質保証を考える
techiro
2
790
現場を動かすAIエージェント#2_製造業現場でのAI活用から見た、ハマる罠と実践知
kintotechdev
2
170
【dbts2026】AIエージェントの 判断と探索を変える、 データベース エンジニアリング― 既存DBの処理と依存関係から作る、オペレーショナルオントロジー ―
shisyu_gaku
0
160
推論基盤と Scale-Up Interconnect の現状と制約から俯瞰する技術動向
markunet
2
810
kintoneで在庫管理システムを作るときの要件定義・設計ポイント
kai0707
0
230
AWS構成から考えるWebセキュリティ ― WordPressの構築経験から考える公開範囲と更新運用【JAWS FESTA 2026 in AKITA】
cscengineer
PRO
1
190
セキュリティ専任チームなしで攻撃を先回りするSREが実践したSIEM on Amazon OpenSearch Service
cscengineer
PRO
0
240
Microsoft Entra Kerberos で実現するクラウド デバイス管理
tamaiyutaro
2
460
Oracle Database Security 詳細解説
oracle4engineer
PRO
2
250
Featured
See All Featured
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
300
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
760
Game over? The fight for quality and originality in the time of robots
wayneb77
1
330
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
880
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
480
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
630
Ruling the World: When Life Gets Gamed
codingconduct
0
430
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
320
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.6k
Agile that works and the tools we love
rasmusluckow
331
22k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
8.2k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
1
300
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
ご清聴ありがとうございます