2016-04-05 14 views
1

私はすべて同じインターフェース/契約を実装する複数のサービスを作成しようとしています。だから私はコントローラからユーザーから選択されたサービスを受けることができます。複数のサービスが同じインターフェースを実装しており、実行時に切り替える

サービスプロバイダ:コントローラで

/** 
* 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クラスからデータを取得することはできません。つまり、ユーザーから選択されたサービスを取得できないということですか?だから私はどうすればいいのですか?

+1

これは良い質問ですが、サービスプロバイダに登録されているlaravelサービスを使用して実行時に実行することはできません。ブートストラップ時にロードする必要があります。ミドルウェアで同様のことを達成できるかもしれません。ミドルウェアはリクエストオブジェクトにアクセスできるため、その時点でインターフェイスと実装の間のバインドを開始できるはずです。 – delatbabel

+0

ミドルウェアではわかりません。私に例を挙げてもらえますか?ありがとうございました !!! – user3118789

答えて

1

あなたはコールバックでそれをバインドすることができます。

$this->app->bind(ReportContract::class, function($app) { 
    $request = $app['request']; 

    $service = studly_case($request->input('production')) . 'Repository'; 

    if (in_array($service, $this->availableServices)) 
    { 
     $namespace = (new \ReflectionClass(ReportContract::class))->getNamespaceName(); 

     return $app->make("{$namespace}\\{$service}"); 
    } 
}); 

あなたはしかし、デフォルトを返すようにしたいかもしれません。

+0

これは動作しません。$ request-> all()は常に空の配列を返します。 – user3118789

関連する問題