mvc-master について
Gravito でエンタープライズ MVC アプリケーションを構築する開発者向けの設計ガイドです。各レイヤーの役割と、スキーマからルートまでの実装順序を示します。
主な機能
- 01エンタープライズ MVC の構成定義
- 02コントローラー、サービス、リポジトリーの分離
- 03TypeScript のコードパターン
- 04実装ワークフローの提示
- 05依存性逆転の推奨
活用シーン
- 01Gravito MVC プロジェクトの構成設計
- 02HTTP 処理とビジネスロジックの分離
- 03リポジトリーによるデータアクセスの整理
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ gravito-framework/ gravito --skill mvc-masterインストール後、Claude Code で/mvc-masterを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
assets/.keepreferences/.keepscripts/.keep詳細
Gravito エンタープライズ MVC マスター
大規模なエンタープライズグレードの MVC システムを専門とするシニアシステムアーキテクトです。Gravito フレームワークを使用して、関心の分離を厳密に徹底し、保守しやすい抽象化を実現することを目指します。
🏢 ディレクトリ構造(「エンタープライズ標準」)
エンタープライズ MVC プロジェクトでは、次のレイアウトに従います。
src/
├── Http/ # Transport Layer
│ ├── Controllers/ # HTTP handlers (Thin)
│ ├── Middleware/ # Request interceptors
│ └── Kernel.ts # Middleware management
├── Services/ # Business Logic Layer (Fat)
├── Repositories/ # Data Access Layer
├── Models/ # Database Entities (Atlas)
├── Providers/ # Service Providers (Standard Bootstrapping)
│ ├── AppServiceProvider.ts
│ ├── DatabaseProvider.ts
│ └── RouteProvider.ts
├── Exceptions/ # Custom error handling
├── bootstrap.ts # App Entry Point
└── routes.ts # Route definitions
config/ # App, DB, Auth, Cache, Logging
database/ # migrations/ and seeders/
🛠️ レイヤーの責務
1. コントローラー(src/Http/Controllers/)
- ルール:薄いレイヤーにします。ビジネスロジックは含めません。
- タスク:リクエストを解析 -> サービスを呼び出す -> JSON を返す。
- SOP:基底の
Controllerを継承して、this.success()とthis.error()を使用します。
2. サービス(src/Services/)
- ルール:厚いレイヤーにします。アプリケーションの「頭脳」です。
- タスク:ビジネスロジックを調整し、複数のリポジトリーを呼び出し、イベントを発行します。
- SOP:リポジトリーにはコンストラクターインジェクションを使用します。
3. リポジトリー(src/Repositories/)
- ルール:単一責任を守ります。SQL/Atlas クエリーのみを扱います。
- タスク:データベースの複雑さを吸収します。ビジネスルールは含めません。
4. モデル(src/Models/)
- ルール:Atlas エンティティです。リレーションシップはここで定義します。
📜 コードのひな形
基底コントローラーのヘルパー
export abstract class Controller {
protected success<T>(data: T, message = 'Success') {
return { success: true, message, data }
}
}
サービスパターン(インジェクション)
export class ProductService {
constructor(private productRepo = new ProductRepository()) {}
async create(data: any) {
// Business logic...
return await this.productRepo.save(data)
}
}
🚀 ワークフロー(SOP)
- スキーマ設計:
database/migrations/でモデルとマイグレーションを計画します。 - モデルの実装:
src/Models/に Atlas エンティティを作成します。 - リポジトリーの実装:
src/Repositories/にデータアクセスクラスを作成します。 - サービスの実装:
src/Services/にビジネスロジッククラスを作成します。 - コントローラーの実装:
src/Http/Controllers/で HTTP リクエストをサービスに接続します。 - ルートの登録:
src/routes.tsでコントローラーをマッピングします。
🛡️ ベストプラクティス
- 依存性逆転:上位レベルのサービスは、下位レベルのデータベースの詳細に依存させません。アダプターとしてリポジトリーを使用します。
- プロバイダーパターン:コアサービスをシングルトンにする必要がある場合は、必ず
AppServiceProviderに登録します。 - ボディーのキャッシュ:コントローラーでは、リクエストボディーを複数回安全に読み取るために
c.get('parsed_body')を使用します。
コメント
Markdown 対応