前提
前提条件としてすでに 1つのモジュール(以下の例で BModule)はすでに実装されております。
モジュールは API(REST 通信)にて情報を取得し、後続処理でそのデータを使用します。
今後別の APIプログラムにアクセスする CModule を実装を予定しており、
それはユーザーの情報によって切り替える必要があります。
既存の処理を変更したくないため、サービスコンテナを切り替えることで、新たなモジュール
「CModule」を実装したいと考えています。
実現したいこと
通常はサービスプロバイダーで行うとと思いますが、リクエストパラメーターを使用したDBアクセスを伴うためコントローラーで行いたいです。
そのような方法は可能でしょうか?
現状の実装
完全なプログラムを公開することはできないため、一部加工してあります。
インターフェイス
namespace App\Modules; interface ModuleBase { public function getData(); public function getPath(); public function getItem(); //その他複数のメソッド
作成したインターフェイスを継承する 2つのモジュール
namespace App\Modules; class BModule implements ModuleBase { private $data; public function getData(){ $url = 'https://b.xxxxx.xxx/api/xxx'; $client = new \GuzzleHttp\Client(); $response = $client->request( 'POST', $url, ['key' => 'xxxxxxx'] ); $this->data = $response->getBody(); } public function getPath(){ return $this->data['path']; } public function getItem(){ return $this->data['item']; } //その他複数のメソッド
namespace App\Modules; class CModule implements ModuleBase { public function getData(){ $url = 'https://c.xxxxx.xxx/api/xxx'; $client = new \GuzzleHttp\Client(); $response = $client->request( 'POST', $url, ['key' => 'xxxxxxx', 'user' => 'xxxxxx'] ); $this->data = $response->getBody(); } public function getPath(){ $res = implode('/', $this->data['path']) return $res; } public function getItem(){ return $this->data['item']; } //その他複数のメソッド
既存処理である BModule はサービスコンテナに登録されている
namespace App\Providers; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { /** * Bootstrap any application services. * * @return void */ public function boot() { // } /** * Register any application services. * * @return void */ public function register() { $this->app->bind( 'App\Modules\ModuleBase', 'App\Modules\BModule' ); } }
既存処理 BModule をコントローラーで CModule に切り替えたい
namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use App; class ItemController extends Controller { public function index(Request $request) { $id = $request->input('user_id'); $user = \App\User::find($id); if($user->apiStatus == 1){ //■■ここで ModuleBase と CModule をバインドする方法が知りたいです。■■ } $api = App::make(App\Modules\ModuleBase::class); $api->getData(); //これ以降にも「App::make(App\Modules\ModuleBase::class)」を使用してデータを取得する処理があります。 //既存の処理を変更したくないため、サービスコンテナで切り替えたいと考えております。
回答1件
あなたの回答
tips
プレビュー