中〜大規模なLaravelプロジェクトでは、ControllerとModelだけでアプリ全体を構成するのは限界があります。
本記事では、設計の原則であるSOLIDに触れつつ、Laravelでも実践可能なClean Architecture(クリーンアーキテクチャ)を導入するための考え方とディレクトリ構成を解説します。

1. SOLID原則とは?
SOLIDは、ソフトウェア設計における5つの原則をまとめた頭文字です。Laravelのコードベースでも十分に活用可能です。
- S: 単一責任の原則(Single Responsibility)
- O: 開放/閉鎖の原則(Open/Closed)
- L: リスコフの置換原則(Liskov Substitution)
- I: インターフェース分離の原則(Interface Segregation)
- D: 依存性逆転の原則(Dependency Inversion)
これらの原則を意識することで、拡張性・テスト性・保守性の高いLaravelアプリが実現できます。
2. Clean Architectureとは?
Clean Architecture(クリーンアーキテクチャ)は、アプリケーションを以下のようなレイヤーに分割して設計するアプローチです:
┌──────────────┐ │ プレゼンテーション層(Controller) │ ├──────────────┤ │ アプリケーション層(UseCase) │ ├──────────────┤ │ ドメイン層(Entity / Logic) │ ├──────────────┤ │ インフラ層(DB, 外部API, Repository) │ └──────────────┘
中心ほどビジネスロジック、外側はデータベースやフレームワーク依存の処理です。依存は外から中へ流れるべきであり、ビジネスロジックがLaravelに依存しない構造が理想です。
3. Laravelでの実践的なClean Architecture構成
推奨ディレクトリ構成例:
/app
├── Http/Controllers ├── UseCases/Task │ └── CreateTaskUseCase.php ├── Domain/Task │ ├── Task.php │ └── TaskRepositoryInterface.php ├── Infrastructure/Task │ └── EloquentTaskRepository.php └── Providers └── AppServiceProvider.php
UseCase(アプリケーション層)の例
// app/UseCases/Task/CreateTaskUseCase.php
namespace App\UseCases\Task;
use App\Domain\Task\TaskRepositoryInterface;
class CreateTaskUseCase {
private TaskRepositoryInterface $repository;
public function __construct(TaskRepositoryInterface $repository) {
$this->repository = $repository;
}
public function handle(array $data) {
return $this->repository->create($data);
}
}
インターフェースとインフラ層の実装
// app/Domain/Task/TaskRepositoryInterface.php
namespace App\Domain\Task;
interface TaskRepositoryInterface {
public function create(array $data);
}
// app/Infrastructure/Task/EloquentTaskRepository.php
namespace App\Infrastructure\Task;
use App\Models\Task;
use App\Domain\Task\TaskRepositoryInterface;
class EloquentTaskRepository implements TaskRepositoryInterface {
public function create(array $data) {
return Task::create($data);
}
}
DIバインド
// app/Providers/AppServiceProvider.php
use App\Domain\Task\TaskRepositoryInterface;
use App\Infrastructure\Task\EloquentTaskRepository;
public function register() {
$this->app->bind(TaskRepositoryInterface::class, EloquentTaskRepository::class);
}
コントローラーでUseCaseを呼び出す
// app/Http/Controllers/TaskController.php
use App\UseCases\Task\CreateTaskUseCase;
use Illuminate\Http\Request;
class TaskController extends Controller {
public function store(Request $request, CreateTaskUseCase $useCase) {
$useCase->handle($request->only('title'));
return redirect()->route('tasks.index');
}
}
4. アーキテクチャ整理のメリット
Laravel依存をドメインから排除し、再利用性アップ
ユースケースごとのテストが簡単になる
責任が明確で、新人でも保守しやすい
外部API・DB変更時の影響が最小限に
まとめ
LaravelをMVCだけで構成するのではなく、SOLID原則を意識し、アーキテクチャを整理することで、開発チーム全体の生産性・品質を大幅に向上させることが可能です。
Clean Architectureを一度導入してしまえば、仕様変更にも強く、拡張しやすい堅牢な構造になります。まずは小さなUseCaseからでも導入を始めてみましょう。