Laravelアプリを堅牢に保つアーキテクチャ設計

中〜大規模な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からでも導入を始めてみましょう。

採用情報 長谷川 横バージョン
SHARE
PHP Code Snippets Powered By : XYZScripts.com
お問い合わせ