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
実装と乖離させないスキーマ駆動開発フロー / OpenAPI Laravel編
Search
katzumi
June 18, 2023
Technology
290
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
230
『eg-r2』のご紹介
katzumi
0
34
runn開発者会議福岡2024
katzumi
0
36
リリース戦略を支えるCI/CDパ イプライン
katzumi
0
32
APIテストでもカバレッジ測定 したい!
katzumi
0
30
Slidevのテンプレートリポジトリについて
katzumi
0
160
OSSへの感謝を伝える
katzumi
0
670
モブワークを進化させていった話
katzumi
0
510
ActiveRecordパターンの呪縛を学びほぐして挑むクリーンアーキテクチャへの入り口
katzumi
0
66
Other Decks in Technology
See All in Technology
2026-08-15 JAWS-UG 茨城 #16 Secrets ManagerにおけるSecret値の管理(Terraformの場合) / Secrets Manager Secrets
masasuzu
0
450
AIのためのEthernet技術動向 (SerDes)
markunet
1
260
도구에서 동료까지: 10년차 AI 스타트업의 AI 적응기
inureyes
PRO
1
310
2027年のMetricKit
kantacky
0
140
私がブラウザを自作したくなった理由
supurazako
1
280
Master Dataグループ紹介資料
sansan33
PRO
1
4.8k
ガバメント AI 源内を地方自治体は活用できるのか可能性と課題、期待について
takeda_h
2
460
Sansan Engineering Unit 紹介資料
sansan33
PRO
1
5k
英語が話せなくてもKubeConスタッフに参加した話
yusuke427
1
1.1k
20260817_生成AIの動向と中学校・高等学校での活用を考える_v1.00_公開用
doradora09
PRO
0
170
35分でわかるEffective Platform Engineering
nwiizo
5
570
AI時代に、人は何を、どう学ぶのか #pbl_pub / What and How Do We Learn in the AI Era?
takaking22
1
190
Featured
See All Featured
Mind Mapping
helmedeiros
PRO
1
330
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Test your architecture with Archunit
thirion
2
2.4k
Designing for humans not robots
tammielis
254
26k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
Designing for Timeless Needs
cassininazir
1
450
Discover your Explorer Soul
emna__ayadi
2
1.3k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.3k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
500
Facilitating Awesome Meetings
lara
57
7.1k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
660
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
ご清聴ありがとうございます