Loading...
Loading...
7-layer architecture design guidelines for Laravel applications. Covers layer responsibilities, dependency rules, and Laravel-native patterns. Reference this skill when planning backend architecture decisions during Phase 1 (Planning & Review).
npx skill4agent add asakuno/template-repository backend-architecture-guidelines.claude/rules/backend/7層レイヤードアーキテクチャ(Laravel-native)
┌─────────────────────────────────────────────────────────────┐
│ Presentation Layer │
│ (Controller, Middleware, Inertia) │
└─────────────────────────────┬───────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Request Layer │
│ (FormRequest, Validation) │
└─────────────────────────────┬───────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ UseCase Layer │
│ (Business Logic, DTO) │
└─────────────────────────────┬───────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Service Layer │
│ (Shared/Reusable Logic) │
└─────────────────────────────┬───────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Repository Layer │
│ (Data Access Abstraction) │
└─────────────────────────────┬───────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Model Layer │
│ (Eloquent Models) │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Resource Layer │
│ (JSON Response Transformation) │
└─────────────────────────────────────────────────────────────┘app/app/
├── Http/
│ ├── Controllers/
│ │ ├── Api/ # API Controllers(REST API)
│ │ └── Web/ # Web Controllers(Inertia.js用)
│ ├── Requests/ # FormRequests(バリデーション)
│ └── Resources/ # API Resources(JSONレスポンス)
├── UseCases/ # UseCases(ビジネスロジック)
│ └── {Resource}/
│ ├── Create{Resource}UseCase.php
│ └── Update{Resource}UseCase.php
├── Services/ # Services(共通ロジック)
├── Repositories/ # Repositories(データアクセス)
│ └── {Resource}/
│ ├── {Resource}RepositoryInterface.php
│ └── {Resource}Repository.php
├── Data/ # DTOs(Laravel Data)
│ └── {Resource}/
│ ├── Create{Resource}Data.php
│ └── Update{Resource}Data.php
├── Models/ # Eloquent Models
├── Policies/ # Policies(認可)
└── Enums/ # Enums(列挙型)Presentation → Request → UseCase → Service/Repository → Model → Resource| レイヤー | 依存可能 | 依存禁止 |
|---|---|---|
| Presentation (Controllers) | Request, UseCase, Resource | Model直接, Service直接 |
| Request (FormRequests) | DTO (Laravel Data) | Model, UseCase |
| UseCase | Repository Interface, Service, Policy | Controller, Request |
| Service | Repository, Model | Controller, UseCase |
| Repository | Model | Controller, UseCase |
| Model | なし(最下層) | 全ての上位層 |
| Resource | Model | Controller, UseCase |
| レイヤー | 責務 | 配置 |
|---|---|---|
| Presentation | HTTP Request/Response, 認可チェック | |
| Request | バリデーション、DTO変換 | |
| UseCase | ビジネスロジック、トランザクション制御 | |
| Service | 汎用的なビジネスロジック(複数UseCaseで共有) | |
| Repository | データアクセス抽象化、複雑なクエリ | |
| Model | ドメインモデル、リレーション定義 | |
| Resource | JSONレスポンス整形 | |
| 種別 | 責務 | 命名 |
|---|---|---|
| Web Controller | 初期ページ描画、静的マスターデータ提供 | |
| API Controller | CRUD操作、動的データ処理 | |
.claude/rules/backend/02-layers.md# deptrac/layer.yaml
deptrac:
paths:
- ./app
layers:
- name: Presentation
collectors:
- type: directory
value: app/Http/Controllers
- name: Request
collectors:
- type: directory
value: app/Http/Requests
- name: UseCase
collectors:
- type: directory
value: app/UseCases
- name: Service
collectors:
- type: directory
value: app/Services
- name: Repository
collectors:
- type: directory
value: app/Repositories
- name: Model
collectors:
- type: directory
value: app/Models
- name: Resource
collectors:
- type: directory
value: app/Http/Resources
ruleset:
Presentation:
- Request
- UseCase
- Resource
Request:
- Data
UseCase:
- Repository
- Service
- Policy
Service:
- Repository
- Model
Repository:
- Model
Resource:
- Model
Model: []# 検証コマンド
./vendor/bin/deptrac analyse --config-file=deptrac/layer.yaml// ❌ WRONG
class PostController extends Controller
{
public function store(Request $request)
{
// ビジネスロジックがControllerに
if (Post::where('user_id', auth()->id())->count() > 10) {
throw new \Exception('Limit exceeded');
}
$post = Post::create($request->all());
return response()->json($post);
}
}
// ✅ CORRECT
class PostController extends Controller
{
public function store(StorePostRequest $request, CreatePostUseCase $useCase)
{
$data = $request->getCreatePostData();
$post = $useCase->execute($data);
return response()->json(new PostResource($post), 201);
}
}// ❌ WRONG
class CreatePostUseCase
{
public function execute(Request $request): Post // HTTP依存
{
return Post::create($request->all());
}
}
// ✅ CORRECT
class CreatePostUseCase
{
public function execute(CreatePostData $data): Post // DTOを使用
{
return $this->repository->create(...);
}
}// ❌ WRONG
class PostPageController extends Controller
{
public function index()
{
return Inertia::render('Post/Index', [
'posts' => Post::all(), // 動的データをWeb Controllerで
]);
}
}
// ✅ CORRECT
class PostPageController extends Controller
{
public function index()
{
return Inertia::render('Post/Index', [
'statusOptions' => PostStatus::toSelectArray(), // 静的データのみ
]);
// 動的データはReact側からAPI経由で取得
}
}| ケース | 理由 |
|---|---|
| 複雑なクエリ | 複数テーブル結合、サブクエリ、集計処理 |
| トランザクション制御 | 複数のDB操作を1つのトランザクションで管理 |
| テスト容易性 | モック可能なインターフェース提供 |
| ケース | 理由 |
|---|---|
| シンプルな CRUD | Eloquent の標準機能で十分 |
| 単一モデル操作 | 複雑なクエリロジックがない |
.claude/rules/backend/02-layers.md| ケース | 例 |
|---|---|
| 複数UseCase間で共有されるロジック | ファイルエクスポート、通知送信 |
| 外部サービス連携 | API呼び出し、メール送信 |
| 複雑な計算処理 | レポート集計、統計計算 |
#[TypeScript()]readonly.claude/rules/backend/01-overview.md.claude/rules/backend/02-layers.md.claude/rules/backend/03-dto-data.md.claude/rules/backend/04-typescript-generation.md.claude/rules/backend/05-inertia-backend.md.claude/rules/backend/06-testing.md.claude/rules/backend/07-best-practices.md.claude/rules/backend/08-coding-standards.md