PHPとレイヤードアーキテクチャの相性 — 言語特性・フレームワーク別の適合度と導入判断

レイヤードアーキテクチャとは — MVCとどう違うのか レイヤードアーキテクチャは、アプリケーションを責務ごとに水平な層(Layer)へ分割する設計手法です。一般的には次の4層で構成されます。 層 責務 依存方向 Presentation HTTPリクエスト・レスポンスの変換、入力バリデーション 下の層のみ参照 Application (UseCase) ユースケース単位のオーケストレーション Domain 層を利用 Domain ビジネスルール、エンティティ、値オブジェクト 外部依存なし Infrastructure DB接続、外部API通信、メール送信 Domain 層のインターフェースを実装 MVCは「リクエスト → Controller → Model → View」というデータフローを定義しますが、「Model」が担う範囲が曖昧です。ORMのクエリビルダ、ビジネスルール、外部API呼び出しが同じModel内に混在し、数千行のFat Modelが生まれる原因になります。 レイヤードアーキテクチャはModelの内部をApplication・Domain・Infrastructureの3層に分解し、それぞれの責務境界を明確にします。MVCを否定するのではなく、MVCの「M」を精緻化する位置づけです。 PHPの言語特性がレイヤード構造に与える影響 PHPでレイヤードアーキテクチャを採用する場合、言語そのものの特性が設計にどう作用するかを把握しておく必要があります。 動的型付けとインターフェース設計 PHPは動的型付け言語ですが、interface・abstract class・type hintを備えています。レイヤードアーキテクチャではDomain層にインターフェース(Repository契約など)を定義し、Infrastructure層で実装する「依存性の逆転」が核になります。 // Domain層: app/Domain/Repository/UserRepositoryInterface.php namespace App\Domain\Repository; use App\Domain\Entity\User; interface UserRepositoryInterface { public function findById(int $id): ?User; public function save(User $user): void; } // Infrastructure層: app/Infrastructure/Persistence/EloquentUserRepository.php namespace App\Infrastructure\Persistence; use App\Domain\Entity\User; use App\Domain\Repository\UserRepositoryInterface; use App\Infrastructure\Persistence\Eloquent\UserModel; class EloquentUserRepository implements UserRepositoryInterface { public function findById(int $id): ?User { $record = UserModel::find($id); if ($record === null) { return null; } return new User($record->id, $record->name, $record->email); } public function save(User $user): void { UserModel::updateOrCreate( ['id' => $user->getId()], ['name' => $user->getName(), 'email' => $user->getEmail()] ); } } PHPのインターフェースはJavaやC#と同等の抽象化機構を提供するため、「依存性の逆転」を言語レベルで実現できます。ただし、型の強制力はコンパイル言語より弱いため、静的解析ツール(PHPStan・Psalm)を併用してレイヤー間の依存違反を検出する運用が有効です。 ...

2026年2月8日 · 4 分 · 12460 文字 · uiuifree