はじめに
Laravel開発において「DI(依存性注入)」は強力な武器ですが、単にクラスを注入するだけでなく、Dockerやconfigファイルとどう繋がっているかを理解することで、より堅牢な設計が可能になります。 本記事では、外部設定がどのようにクラスまで届くのか、その「バケツリレー」を可視化します。
1. 全体図:情報のバケツリレー
設定値がアプリケーションに届くまでの流れは以下の通りです。
-
Docker (.env):ホストの環境変数
-
Docker (docker-compose.yml):コンテナ内の環境変数として注入する橋渡し役
-
Config (Config/*.php):PHP設定値として集約(キャッシュ可能)
-
Service Provider (DI):クラスの生成ルールに設定値を反映
-
Controller等:注入されたインスタンスを利用
2. 実践的な設定の流れ
「外部決済サービス(PaymentService)」を例に解説します。
ステップ1:ホストOSの .env(Docker用)
docker-compose.yml と同じディレクトリに配置します。ここに「秘匿情報(APIキーなど)」の実体を書きます。
# {プロジェクトルート}/.env
PAYMENT_API_KEY=sk_test_12345
ステップ2:docker-compose.yml でコンテナへ橋渡し
${} 構文を使い、ステップ1の値をコンテナ内のOS環境変数へ受け渡します。
services:
app:
environment:
# ホストの .env からコンテナ内 OS の環境変数へ
- STRIPE_KEY=${PAYMENT_API_KEY}
ステップ3:Laravelの config/*.php で受け取る
Laravel(PHP)は、OSの環境変数を env() 関数で直接拾うことができます。
return [
'stripe' => [
'key' => env('STRIPE_KEY'), // コンテナOSの環境変数を読み込む
],
];
ステップ4: Service ProviderでDIの「レシピ」を書く
ここがDIの核心です。**「PaymentServiceクラスを誰かが欲しがったら、configの値を使ってこう作ってあげてね」**という指示を書きます。
use App\Services\PaymentService;
public function register(): void
{
// singletonとして登録することで、アプリ内で一つのインスタンスを使い回す
$this->app->singleton(PaymentService::class, function ($app) {
return new PaymentService(config('services.payment.key'));
});
}
ステップ5: 利用側でインスタンスを使用
利用側(Controllerなど)は、configのことなど知る必要はありません。ただ「欲しいクラス」を指定するだけです。
class OrderController extends Controller
{
// コンストラクタで型ヒントを書くだけで、
// 設定済みのPaymentServiceが自動的に「注入」される
public function __construct(
private PaymentService $paymentService
) {}
public function store()
{
$this->paymentService->execute();
}
}
3. なぜこの「回り道」が必要なのか?
① セキュリティと柔軟性
ソースコードにAPIキーを直書きせず、Dockerや.env経由にすることで、**「コードは変えずに、本番用と開発用のキーを差し替える」**ことが容易になります。
② テスタビリティ(テストのしやすさ)
DIを使っていると、テスト時に「本物のAPIを叩くクラス」を「テスト用の偽物(Mock)」に簡単に差し替えられます。
// テストコードでDIの中身を偽物に差し替える例
$this->instance(
PaymentService::class,
Mockery::mock(PaymentService::class, function ($mock) {
$mock->shouldReceive('execute')->once();
})
);
まとめ
LaravelのDIは、単なるクラスの呼び出し手段ではありません。 Docker → .env → Config → DI という流れを意識することで、インフラからアプリまでが一本の線で繋がり、変更に強くテストがしやすい「綺麗なコード」になります。