DIに関しては今までも何度か触れましたが、最終的には環境の差異を吸収できるなどが一番のポイントかと。
サンプルソース
https://github.com/umanari145/effector
上記のソースでは主に郵便番号を呼ぶときにローカルだとJSON、それ以降の環境ではAPIをよぶなんてやってますが、
で、テストを書いている時もローカルクラスを使うか、APIを使うかを自動で読み込んで欲しい時なんてのがあります。
そんな時には、以下のように書けば動きます。
effector/tests/Service/PostServiceTest.php
1 2 3 |
// このように書いておくとlocalではJSONを叩き、本番以降ではAPIを叩くことになる $service = new PostService(app()->make(AddressRepositoryInterface::class)); $res = $service->getAddress(2740077); |
これはPostServiceの中にAddressRepositoryInterfaceがあり、
AddressRepositoryInterface
→ローカル時はLocalAddressRepository
→開発時はApiAddressRepository
といった構成。
コード本体は以下のようにDIコンテナでAddressRespositoryInterfaceを使い分けており、環境によって実装クラスが異なる。
effector/app/Providers/AddressServiceProvider.php
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$this->app->bind(AddressRepositoryInterface::class, function ($app) { //依存性の注入 $env = env('APP_ENV', 'local'); switch ($env) { case 'local': case 'testing': return new LocalAddressRepository(); break; case 'prd': return new ApiAddressRepository(); break; } }); |
DIで大事なことは以下2点かと思います。
- 環境ごとに呼ばれるクラスが異なる
- それに関連する依存クラスも自動的に紐付けがされる
わかりやすい参考サイトがあったのでリンクを。
【Laravel】サービスコンテナとは?2つの強力な武器を持ったインスタンス化マシーン。簡単に解説。
リポジトリパターンと Laravel アプリケーションでのディレクトリ構造
↑非常にわかりやすいローカルとAPIの差異に関して。(ほぼサンプルと同じパターン)