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
290
『eg-r2』のご紹介
katzumi
0
42
runn開発者会議福岡2024
katzumi
0
41
リリース戦略を支えるCI/CDパ イプライン
katzumi
0
39
APIテストでもカバレッジ測定 したい!
katzumi
0
38
Slidevのテンプレートリポジトリについて
katzumi
0
160
OSSへの感謝を伝える
katzumi
0
700
モブワークを進化させていった話
katzumi
0
530
ActiveRecordパターンの呪縛を学びほぐして挑むクリーンアーキテクチャへの入り口
katzumi
0
68
Other Decks in Technology
See All in Technology
二歩目のフロントエンド・ウェブアクセシビリティ
camiha
2
480
分析AIエージェントを育てる、動く環境を育てる
codatum
1
1.1k
LambdaWebFunctionsを試してみた / exploring-lambda-web-functions
koukihosaka
0
260
Optunaの最新リリースv5.0について
pfn
PRO
0
100
しろおびから始める!ログ活用の第一歩
shumei_ito
0
940
「事実」を「計測」して、「解釈」する 〜AWS Lambdaのメモリ最適解の見つけ方〜
maimyyym
0
150
スプシの手作業からの解脱 ~更新はClaude Codeに、見せ方と使い方はGASアプリに任せる~
kentarofujii
0
140
AI駆動開発の時代になったのでトヨタ生産方式から見直す
terurou
7
6k
M5Stackで作る BLEマウス GPSログの世界
tomokusaba
0
380
Post AI時代のリファクタリング実践記 / Refactoring in the post AI era
kaminashi
1
220
事業成長とデータ活用を止めないためのマネジメントへ挑戦
hiracky16
0
350
初対面のメンバーがチームを組み、Claude Codeでゼロからサービスをリリース
mkdev10
1
130
Featured
See All Featured
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
46k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
50
10k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
730
Utilizing Notion as your number one productivity tool
mfonobong
4
620
How to make the Groovebox
asonas
2
2.5k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
2
2k
Context Engineering - Making Every Token Count
addyosmani
9
1.2k
Ten Tips & Tricks for a 🌱 transition
stuffmc
1
260
Abbi's Birthday
coloredviolet
4
10k
Optimising Largest Contentful Paint
csswizardry
37
4k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
31k
Code Reviewing Like a Champion
maltzj
529
40k
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
ご清聴ありがとうございます