Ccmmutty logo
Commutty IT
0 pv2 min read

【Laravel】同じインターフェースを異なるサービスにDIする方法

https://cdn.magicode.io/media/notebox/blob_6kWBqSS
Laravelのコンテキストバインディングは、同じインターフェースに対して、サービスクラスごとに異なる実装を注入できる仕組みです。コントローラーごとに異なるサービス実装を使いたい場合などに便利です。

使用例

認証サービスの切り替え

// 一般ユーザー認証サービス
$this->app->when(UserAuthService::class)
    ->needs(AuthServiceInterface::class)
    ->give(function () {
        return new BasicAuthService();
    });

// 管理者認証サービス
$this->app->when(AdminAuthService::class)
    ->needs(AuthServiceInterface::class)
    ->give(function () {
        return new TwoFactorAuthService();
    });
このコードでは、AuthServiceInterfaceという同じインターフェースに対して、ユーザー種別に応じて異なる認証サービスを注入しています:
  • UserAuthServiceにはBasicAuthServiceを注入
    • 一般ユーザー向けの標準的なパスワード認証を提供
  • AdminAuthServiceにはTwoFactorAuthServiceを注入
    • 管理者向けの二要素認証を提供し、セキュリティを強化

使用するタイミング

  • 同じインターフェースに対して、サービスクラスごとに異なる実装が必要な場合
  • 機能ごとに異なる実装を提供したい場合
  • サービスクラスの責務に応じて実装を切り替えたい場合

まとめ

コンテキストバインディングは、同じインターフェースに対して、サービスクラスごとに異なる実装を柔軟に注入できる機能です。これにより、サービスクラスの責務に応じた適切な実装を提供できます。

参考リンク

Discussion

コメントにはログインが必要です。