1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LaravelのDI(依存性注入)を極める:Docker環境変数からクラス注入までの「情報の旅」

Last updated at Posted at 2025-12-29

はじめに

Laravel開発において「DI(依存性注入)」は強力な武器ですが、単にクラスを注入するだけでなく、Dockerやconfigファイルとどう繋がっているかを理解することで、より堅牢な設計が可能になります。 本記事では、外部設定がどのようにクラスまで届くのか、その「バケツリレー」を可視化します。

1. 全体図:情報のバケツリレー

設定値がアプリケーションに届くまでの流れは以下の通りです。

  1. Docker (.env):ホストの環境変数

  2. Docker (docker-compose.yml):コンテナ内の環境変数として注入する橋渡し役

  3. Config (Config/*.php):PHP設定値として集約(キャッシュ可能)

  4. Service Provider (DI):クラスの生成ルールに設定値を反映

  5. 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 という流れを意識することで、インフラからアプリまでが一本の線で繋がり、変更に強くテストがしやすい「綺麗なコード」になります。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?