私はすべて同じインターフェース/契約を実装する複数のサービスを作成しようとしています。だから私はコントローラからユーザーから選択されたサービスを受けることができます。複数のサービスが同じインターフェースを実装しており、実行時に切り替える
サービスプロバイダ:コントローラで
/**
* Register the application services.
*
* @return void
*/
public function register()
{
$this->app->call([$this, 'registerProductionService']);
}
/**
* Produce video depend on user selection.
*
* @param Request $request
*/
public function registerProductionService(Request $request)
{
$service = studly_case($request->input('production')) . 'Repository';
if (in_array($service, $this->availableServices))
{
$namespace = (new \ReflectionClass(ReportContract::class))->getNamespaceName();
$this->app->bind(ReportContract::class, "{$namespace}\\{$service}");
}
}
:
public function create(ReportContract $report)
{
$report->create();
}
しかし、私はキューから()メソッドを作成呼び出したいとき、私はRequestクラスからデータを取得することはできません。つまり、ユーザーから選択されたサービスを取得できないということですか?だから私はどうすればいいのですか?
これは良い質問ですが、サービスプロバイダに登録されているlaravelサービスを使用して実行時に実行することはできません。ブートストラップ時にロードする必要があります。ミドルウェアで同様のことを達成できるかもしれません。ミドルウェアはリクエストオブジェクトにアクセスできるため、その時点でインターフェイスと実装の間のバインドを開始できるはずです。 – delatbabel
ミドルウェアではわかりません。私に例を挙げてもらえますか?ありがとうございました !!! – user3118789