Upgrade to Pro — share decks privately, control downloads, hide ads and more …

実装と乖離させないスキーマ駆動開発フロー / OpenAPI Laravel編

katzumi
June 18, 2023

実装と乖離させないスキーマ駆動開発フロー / OpenAPI Laravel編

katzumi

June 18, 2023
Tweet

More Decks by katzumi

Other Decks in Technology

Transcript

  1. 実装と乖離させないスキーマ駆 動開発フロー / OpenAPI Laravel 編 Press Space for next

    page (非公式)PHP Conference Fukuoka After Hack!! June 25, 2023. v0.0.21
  2. なぜ乖離が発生するのか? コード生成 実装 変更 ❌ 変更済みのStub を反映することはできない Open API Spec

    Stub コード 実際のコード * ドキュメントが先の場合(コードが先であっても。。)
  3. スキーマ定義をコードに埋め込むという方法 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;
  4. Arttibuteはコードの一部! 生成 実際のコード Attribute 定義 Attribute 定義 Attribute 定義 Controller

    クラス Request クラス Response クラス スキーマファイル ReflectionClassを使ってArttibuteを読み出してゴニョゴニョする
  5. Arttibuteはコードの一部! 生成 ズレが発生しない 実際のコード Attribute 定義 Attribute 定義 Attribute 定義

    実行時評価 自動生成 Controller クラス Request クラス Response クラス Validation ルール Route ファイル スキーマファイル ReflectionClassを使ってArttibuteを読み出してゴニョゴニョする
  6. Arttibuteはコードの一部! 生成 ズレが発生しない 実際のコード Attribute 定義 Attribute 定義 Attribute 定義

    実行時評価 自動生成 Controller クラス Request クラス Response クラス Validation ルール Route ファイル スキーマファイル ReflectionClassを使ってArttibuteを読み出してゴニョゴニョする
  7. スキーマ自体も静的解析すべし! OpenAPI Spec 表示 生成 静的解析 整形 require スキーマファイル spectral

    Redoc 実際のコード Attribute 定義 Attribute 定義 Attribute 定義 実行時評価 自動生成 Controller クラス Request クラス Response クラス Validation ルール Route ファイル swagger-php(L5-Swagger) swagge-ui
  8. リクエスト・レスポンスの正確性を保証させる 生成 参照(リクエスト・レスポンスValidation ) テスト実行 Test コード Use laravel-openapi-validator Controller

    テスト(PHPUnit) 実際のコード 自動生成 実行時評価 Route ファイル Controller クラス Request クラス Validation ルール Response クラス スキーマファイル Controllerテストで laravel-openapi-validator を利用してリクエストとレスポンスを検証
  9. より確実にE2Eで検証 生成 参照(リクエスト・レスポンスValidation ) テスト実行 Test コード API シナリオテスト(runn) 実際のコード

    自動生成 実行時評価 Route ファイル Controller クラス Request クラス Validation ルール Response クラス スキーマファイル APIシナリオテスト( runn )でユースケースを網羅的に検証