Manager とは
Illuminate\Support\Manager は Laravel 4.0 の頃から存在する抽象クラスです。キャッシュ・セッション・メールなど、複数の「ドライバー」を切り替えて使えるシステムを簡単に構築するための基盤を提供します。
「ドライバー」とは、同じインターフェースを持ちながら内部実装が異なるバックエンドのことです。たとえばセッションなら file・cookie・database・redis といったドライバーがあり、設定ファイルの driver キーで切り替えます。
フレームワーク内での利用状況
Manager という名前が付いていても Illuminate\Support\Manager を継承していないクラスが存在します。
継承していないクラスも
extend() で拡張する基本的な考え方は同じです。そのため、Manager パターンを理解することがフレームワーク全体の動作理解につながります。
基本的な仕組み
driver() — ドライバーを取得する
driver() を呼ぶと、次の手順でドライバーが解決されます。
実際のソースコードを見ると、ドライバー名から Str::studly() でメソッド名を組み立てています。
file ドライバーなら createFileDriver() が、my-custom ドライバーなら createMyCustomDriver() が呼ばれます。
extend() — カスタムドライバーを登録する
extend() にドライバー名とクロージャを渡すことで、独自のドライバーを登録できます。クロージャの引数はコンテナインスタンスです。
extend() はクロージャを $this にバインドするため、クロージャ内で Manager のプロパティやメソッドにアクセスできます。
__call — デフォルトドライバーへの委譲
Manager クラスには__call が実装されており、Manager 自身に存在しないメソッド呼び出しはデフォルトドライバーに自動的に委譲されます。
SessionManager::get('key') のように Manager を直接使いつつ、実際の処理はドライバーに任せるという流れが実現しています。
SessionManager の実装例
Illuminate\Session\SessionManager を見ると、Manager の使い方が具体的にわかります。
自作パッケージで Manager を使う
基本的な実装
通知サービスを例に、Manager を継承したカスタムクラスを作ります。
1
Manager を継承したクラスを作る
2
サービスプロバイダーで登録する
3
カスタムドライバーを追加する
4
使用する
MultipleInstanceManager
Illuminate\Support\MultipleInstanceManager は Laravel 10 で追加されたクラスです。Manager がドライバーの「種類」を管理するのに対し、MultipleInstanceManager は名前付きの「インスタンス」を複数管理できます。
Manager との違い
必須メソッド
MultipleInstanceManager を継承する場合は、3つのメソッドを実装する必要があります。
getInstanceConfig() は名前に対応する設定配列を返します。設定には必ず driver(または $driverKey で指定したキー)が含まれている必要があります。
解決フロー
自作パッケージでの実装例
複数の SMS ゲートウェイに同時対応するパッケージを例にします。instance() で名前を指定します。
ドライバーキャッシュの管理
Manager のキャッシュ操作
MultipleInstanceManager のキャッシュ操作
まとめ
Managerはドライバーの「種類」を管理する。createXxxDriver()メソッドを実装し、extend()で拡張するMultipleInstanceManagerはドライバーの「インスタンス」を名前ごとに管理する。複数の接続設定が必要なパッケージに適しているManagerという名前のクラスがすべてIlluminate\Support\Managerを継承しているわけではない。CacheManagerやQueueManagerは独自実装
Macroableトレイト
既存クラスに独自メソッドを追加するMacroableトレイトの使い方を学びます。