🔌

依存性注入(Dependency Injection)が全くわからん人向けの説明

に公開

はじめに

依存性注入はコンポーネント間(コントローラとサービスなど)の依存関係をコード内で硬直的に定義(コントローラ内でメソッドのインスタンスを作成など)するのではなく,外部から注入するデザインパターンである.これにより,コードの柔軟性,テスト容易性,および再利用性が向上する.

といってもよくわからんという人(過去の自分)向けに,依存性注入の基本的な考え方と Laravel での実装方法を解説する.

【例】コントローラにサービスクラスを注入する

Laravel でコントローラがサービスクラスを使用する場合,通常はそのサービスクラスのインスタンスをコントローラのコンストラクタを通じて注入する(他にもやり方があるがまずはこれを押さえれば十分).

twitter のようなアプリケーションをイメージして考えてみる.

app/Http/Controllers/TweetController.php
<?php
namespace App\Http\Controllers;

use App\Services\TweetService;

class TweetController extends Controller
{
  private $tweetService;

  // 🔽 コンストラクタでサービスクラスのインスタンスを注入
  public function __construct(TweetService $tweetService)
  {
    $this->tweetService = $tweetService;
  }

  public function index()
  {
    // サービスクラスのメソッドを直接使用できる
    $tweets = $this->tweetService->allTweets();
    return view('tweets.index', compact('tweets'));
  }
}

【参考】依存性注入を行わない場合

依存性注入を行わない場合,コントローラ内でサービスクラスのインスタンスを作成する必要がある.この場合,各メソッドで毎回サービスクラスのインスタンスを作成する必要があるため面倒である.

app/Http/Controllers/TweetController.php
<?php
namespace App\Http\Controllers;

use App\Services\TweetService;

class TweetController extends Controller
{
  public function index()
  {
    // メソッド内でサービスクラスのインスタンスを作成
    $tweetService = new TweetService();
    $tweets = $tweetService->allTweets();
    return view('tweets.index', compact('tweets'));
  }
}
GitHubで編集を提案

Discussion