2017-01-19 3 views
1

にプリミティブを結合:LaravelはLaravel 5ドキュメントを1としてアレイ

$this->app->when('App\Http\Controllers\UserController') 
      ->needs('$variableName') 
      ->give($value); 

を使用すると、コントローラに単一の値を結合することを可能にします。

複数のサービスプロバイダを同じ$ variableNameにバインドしたいのですが、2番目のプロバイダが最初のプロバイダの値をオーバーライドする代わりに、両方の値を自動的に配列に格納することは可能ですか?例えば

Provider1:

$this->app->when('App\Http\Controllers\UserController') 
      ->needs('$variableName') 
      ->give('Value 1'); 

Provider2:

$this->app->when('App\Http\Controllers\UserController') 
      ->needs('$variableName') 
      ->give('Value 2'); 

その後、UserControllerで、

に私がする結果が欲しい:

var_dump($variableName)として['Value 1', 'Value 2']

これは可能ですか?もしそうでなければ、達成しようとしていることに対する回避策がありますか?

+0

これらのプロバイダーの詳細と、なぜ分離が必要なのかを確認できますか?この場合、プロバイダーが正しく使用されない場合や、タグ付けなど、他の実装が有用な場合があるように見えます。 – Ohgodwhy

+0

@Ohgodwhy私はLaravelプロジェクトのための "モジュール"システムを開発しています。各モジュールにはそれぞれ独自のプロバイダがあり、私はこのメソッドを使用して、別々のモジュールが情報を相互に送信できるようにしました。例えば、メディアモジュールとニュースモジュールの両方が、ページモジュール内のコントローラに情報を送信したいとすると、ページモジュールは、両方のモジュールから情報をアレイで受け取ることになる。 – zuc0001

+0

サービスプロバイダを使うのが初めてなので、私の方法がベストではなかったかもしれません! – zuc0001

答えて

1

問題に取り組む1つの方法は、taggableメソッドを使用することです。私たちに今

$this->app->bind('UserOrders', function() { 
    //again, whatever you need to do 
}); 

$this->app->bind('UserActivity', function(){ 
    //whatever you need to do 
}); 

はその後、別のプロバイダでは、あなたが何か他のものについて知っておく必要があります。例えば、1つのプロバイダでは、ユーザーに関する情報を提供することもできますFinalImplementationProvider(私たちは、コンテナの私たちの前にインスタンス化プロバイダからの私たちのすべてのデータを集計するために実行される最後のプロバイダ)、我々はこれらのすべてにタグを付けることができます。

$this->app->tag(['UserOrders', 'UserActivity'], 'userVariables'); 

最後に、私たちは、このデータのすべてを集約し、UserVariableRepositoryにそれを渡すことができます:

$this->app->bind('UserVariableRepository', function($app) { 
    return new UserVariableRepository($app->tagged('userVariables')); 
}); 

今、あなたのUserVariableRepositoryは、どこからでもあなたに利用できるようになり、あなたの全体のプロバイダのインスタンス内に設定されたすべての変数にアクセスする必要があります応用。

+0

答えをありがとう。これは素晴らしいアプローチです!しかし、私は最後のステップを変更してグローバルUserVariableRepositoryを見つけるのではなく、そのクラスのインスタンスを変数にバインドしたいと思っていました。グローバルにアクセス可能ではなく、送信されている場所にのみ添付されます)。 – zuc0001

+0

私はあなたが($ this-> app-> tag(['UserOrders'、 'UserActivity'])タグをつけたときに、新しいモジュールからこれらの名前を集めることができないと思いましたこのFinalImplementationProviderが手動で変更されない限り、コントローラーでの使用を要求することもできます。そのため、元の質問に戻り、「UserOrders」を呼び出さずに配列に自動的に追加する方法が必要になります。たとえば、タグ付けプロセス。私が考えることができる唯一の他のオプションは、私が直接押すことができるコントローラ内の静的変数を使用することです。 – zuc0001