# チーム開発ガイド（So-Manager / Laravel12）

このドキュメントは、Laravel5 旧コードと Laravel12 新コードが混在する現状で、重複実装を避け、保守しやすい構成を保つための最小ルールを示します。

## ディレクトリと責務

- app/Models
  - 新規機能/新規テーブル向けのEloquentモデル
  - クラス名は単数・StudlyCase（例: `AdminUser`）。ファイル名＝クラス名。
  - 複雑な業務ロジックは置かない（テーブル定義・リレーション・簡易スコープのみ）。
  - 共通Traitは `app/Models/Concerns`、基底は `app/Models/BaseModel.php`。

- app/Legacy
  - 旧システム（Laravel5）の互換モデル群。テーブル名/主キー/既存メソッド・定数を維持。
  - 旧Bladeから参照されるFQCN互換のため、`LegacyServiceProvider` で `class_alias` を設定。

- app/Services
  - 画面用のユースケースを実装（複数モデルのオーケストレーション、CSV、外部API、トランザクション等）。
  - ControllerはServicesのみを呼び出し、モデルを直接組み合わせない。

- app/Support
  - 純粋な技術ユーティリティ（ビジネスロジックを含めない）。

- app/Enums
  - 共通定数はPHP列挙型で表現。旧配列定数から段階的に移行。

## 命名と重複回避

- モデルは1テーブル1モデル。`admin_user.php` のような snake_case は禁止。
- 新しい画面・機能で共通取得口が必要な場合、モデルを複製せず `app/Services/*Service.php` に集約。

## 旧→新の互換方針

- 旧Bladeは当面そのまま動かす（`\App\OperatorQue::QueClass` 等の直参照を許容）。
- 新規Bladeではモデル直参照を避け、Service経由のDTO/配列を描画。
- 段階的に旧配列定数を `app/Enums` へ置換し、`class_alias` を撤去。

### Legacy を新規で使わない（明記）

- `app/Legacy` 配下は互換専用。新規機能・新規画面・新規サービスで `Legacy` を直接参照しないこと。
- モデルは必ず `app/Models` の正式モデルを使用し、Controller からは `app/Services` 経由で利用する。

## Middleware / Provider / Controller

- Middleware: 横断的関心（認証・権限・CSRFなど）。
- Provider: 起動時の装備（DI、イベント、互換エイリアス）。
- Controller: 薄く保ち、入力検証＋Service呼び出しのみ。

## トランザクション

- 複数テーブル更新は Service 層で `DB::transaction()` を使用。

## チェックリスト（PR提出時）

- 新規モデル: テーブル/主キーを明記。既存モデルとの重複なし。
- 新規機能: 複雑な処理は Service に実装。Controllerは薄いか。
- Blade: 新規はモデル直参照なし（旧は許容）。
- ルート: 旧名互換を維持（置換時は動作確認）。

以上。段階的に Enum 化と互換撤去を進め、最終的に Legacy 依存を解消します。


