Laravelでオニオンアーキテクチャを実装する:3つのディレクトリ構成比較

PHP
スポンサーリンク

Laravelの「オニオンアーキテクチャ」における構成例として、3つのディレクトリ構成を紹介します。プロジェクトの規模やチームの好みに応じて、適切なディレクトリ構成を選択してください。

構成例1:基本構成

app/
├─ Domain/
│   ├─ Contracts/
│   │   └─ UserRepository.php
│   ├─ Entities/
│   │   └─ User.php
│   └─ Services/
│       └─ UserService.php
└─ Infrastructure/
    ├─ Http/
    │   └─ Controllers/
    │       └─ UserController.php
    └─ Repositories/
        └─ EloquentUserRepository.php

この構成では、ドメインとインフラストラクチャのディレクトリに分けています。

ドメインディレクトリには、エンティティ、インターフェース、およびサービスが含まれ、インフラストラクチャディレクトリには具体的なリポジトリの実装やコントローラーが含まれます。この方法では、ドメインに関するコードとインフラストラクチャに関するコードが分離されているため、可読性が向上し、メンテナンスも容易になります。

メリット

  1. シンプルでわかりやすい: ドメインとインフラストラクチャのディレクトリに分けられているため、構成がシンプルで理解しやすいです。
  2. 簡単な導入: 既存のLaravelプロジェクトにも比較的簡単に導入できます。
  3. 読みやすさ: ドメインとインフラストラクチャのコードが分離されているため、コードの可読性が向上します。

デメリット

  1. 大規模プロジェクト向けではない: ドメインオブジェクトごとにディレクトリを分けていないため、大規模プロジェクトでは管理が難しくなる可能性があります。
  2. ドメインオブジェクトの関連性が低い: 各ドメインオブジェクト間の関連性が低く、特定のドメインオブジェクトに関連するファイルを見つけにくい場合があります。
  3. 拡張性に制限: ドメインオブジェクトが増えると、ディレクトリ構成が煩雑になる可能性があります。

特徴

  1. ドメインとインフラストラクチャに分割: ドメインとインフラストラクチャのコードが分離されています。
  2. シンプルな構成: ディレクトリ構成がシンプルでわかりやすいです。
  3. 小規模〜中規模プロジェクト向け: 小規模から中規模のプロジェクトに適しています。

構成例2:ドメインオブジェクト別構成

app/
├─ Domain/
│   ├─ Users/
│   │   ├─ Contracts/
│   │   │   └─ UserRepository.php
│   │   ├─ Entities/
│   │   │   └─ User.php
│   │   └─ Services/
│   │       └─ UserService.php
└─ Infrastructure/
    ├─ Http/
    │   └─ Controllers/
    │       └─ UserController.php
    └─ Repositories/
        └─ Users/
            └─ EloquentUserRepository.php

この構成では、ドメインディレクトリ内の各ドメインオブジェクト(ユーザーなど)ごとにサブディレクトリを作成し、エンティティ、契約(インターフェース)、およびサービスを配置しています。

また、インフラストラクチャディレクトリ内のリポジトリディレクトリでも、各ドメインオブジェクトごとにサブディレクトリを作成し、具体的なリポジトリの実装を配置しています。

この方法では、ドメインオブジェクトごとに関連するコードが一箇所にまとまり、特定のドメインオブジェクトに関連するファイルを見つけやすくなります。

メリット

  1. ドメインオブジェクトごとに整理: 各ドメインオブジェクトごとにディレクトリが分けられており、関連するコードが一箇所にまとまっています。
  2. ドメインオブジェクトの関連性が高い: 特定のドメインオブジェクトに関連するファイルがすぐに見つかりやすい構成です。
  3. 大規模プロジェクトに対応: 大規模なプロジェクトでも、ドメインオブジェクトごとにディレクトリが分かれているため、管理しやすくなります。

デメリット

  1. 導入がやや複雑: 既存のLaravelプロジェクトに導入する際に、ディレクトリ構造を変更する必要があります。
  2. ディレクトリが多くなる: ドメインオブジェクトごとにディレクトリが分かれているため、ディレクトリ数が増えて煩雑になる可能性があります。
  3. ドメインオブジェクト間の関連性を理解する必要: ドメインオブジェクトごとにディレクトリが分かれているため、各ドメインオブジェクト間の関連性を理解する必要があります。

特徴

  1. ドメインオブジェクトごとにディレクトリ分割: 各ドメインオブジェクトごとにディレクトリが分けられています。
  2. 関連性が高い構成: 各ドメインオブジェクト間の関連性が高く、特定のドメインオブジェクトに関連するファイルを見つけやすいです。
  3. 大規模プロジェクト向け: 大規模なプロジェクトに適しています。

構成例3:全ドメインオブジェクト別構成

app/
├─ Domain/
│   └─ Users/
│       ├─ Contracts/
│       │   └─ UserRepository.php
│       ├─ Entities/
│       │   └─ User.php
│       └─ Services/
│           └─ UserService.php
└─ Infrastructure/
    ├─ Http/
    │   └─ Users/
    │       └─ Controllers/
    │           └─ UserController.php
    └─ Repositories/
        └─ Users/
            └─ EloquentUserRepository.php

この構成では、ドメインディレクトリ内の各ドメインオブジェクト(ユーザーなど)ごとにサブディレクトリを作成し、エンティティ、契約(インターフェース)、およびサービスを配置しています。

また、インフラストラクチャディレクトリ内のHTTPディレクトリでも、各ドメインオブジェクトごとにサブディレクトリを作成し、コントローラーを配置しています。

そして、インフラストラクチャディレクトリ内のリポジトリディレクトリでも、各ドメインオブジェクトごとにサブディレクトリを作成し、具体的なリポジトリの実装を配置しています。

この方法では、ドメインオブジェクトごとに関連するコードが一箇所にまとまり、特定のドメインオブジェクトに関連するファイルを見つけやすくなります。

メリット

  1. ドメインオブジェクトごとに整理: 各ドメインオブジェクトごとにディレクトリが分けられており、関連するコードが一箇所にまとまっています。
  2. 高い関連性: コントローラーもドメインオブジェクトごとに分けられているため、特定のドメインオブジェクトに関連するファイルがすぐに見つかりやすい構成です。
  3. 大規模プロジェクトに対応: 大規模なプロジェクトでも、ドメインオブジェクトごとにディレクトリが分かれているため、管理しやすくなります。

デメリット

  1. 導入が複雑: 既存のLaravelプロジェクトに導入する際に、ディレクトリ構造を大幅に変更する必要があります。
  2. ディレクトリが多くなる: ドメインオブジェクトごとにディレクトリが分かれているため、ディレクトリ数が増えて煩雑になる可能性があります。
  3. 学習コストが高い: この構成は独自性が高く、チームメンバーにとって慣れるまでに時間がかかる可能性があります。

特徴

  1. ドメインオブジェクトごとにディレクトリ分割: 各ドメインオブジェクトごとにディレクトリが分けられています。
  2. 高い関連性と整理: コントローラーもドメインオブジェクトごとに分けられているため、関連するコードが一箇所にまとまっており、特定のドメインオブジェクトに関連するファイルを見つけやすい構成です。
  3. 大規模プロジェクト向け: 大規模なプロジェクトに適しており、ドメインオブジェクトごとにディレクトリが分かれているため、管理しやすくなります。

おわり

これらの構成例は、オニオンアーキテクチャの原則に従ってドメインとインフラストラクチャのディレクトリを分割しています。

プロジェクトの要件やチームの好みに応じて、最適なディレクトリ構成を選択しましょう。