🔌
依存性注入(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'));
}
}
Discussion