2016-05-25 4 views
1

私がしようとしているのは、自分のeccomerceサイトでPaypalとStripeの両方の支払いを処理することです。しかし、私はこれがどのように行われているのか分かりません。Laravelサービスプロバイダの1つの契約に複数のクラスをバインドする

これは私が持っているものです。

class BillingProvider extends ServiceProvider 
 
{ 
 
    /** 
 
    * Bootstrap the application services. 
 
    * 
 
    * @return void 
 
    */ 
 
    public function boot() 
 
    { 
 
     // 
 
    } 
 

 
    /** 
 
    * Register the application services. 
 
    * 
 
    * @return void 
 
    */ 
 
    public function register() 
 
    { 
 
     $this->app->bind('App\Contracts\BillingInterface','App\Services\Billing\PaypalBilling'); 
 
    } 
 
}

私はPaypalだけを必要とする場合、これは正常に動作します。しかし、私はPaypalとStripeの両方が必要です。

これを実装するにはどうすればよいですか?だから私たちはタイプヒントこれを得ることができるペイパルまたはストライプ。

public function stripe(Request $request, BillingInterface $bill){// Handle stripe payment.} 

public function paypal(Request $request, BillingInterface $bill){// Handle paypal payment.} 
+1

stripe()とpaypal()メソッドが同じクラスにあり、 'BillingInterface'に応じて別の依存オブジェクトを注入しようとしている場合は、' $ this-> app-> make 'PayPalClass') 'メソッド内にあり、DIは使用しません。 – TheFallen

+0

コンテナの解像度を使用せず、インスタンスをインスタンス化して手動で渡します。 – naneri

+0

見るべきリンク:http://stackoverflow.com/questions/31887870/laravel-service-provider-bind-multiple-classes https://laracasts.com/discuss/channels/general-discussion/multiple-services-インプリメンテーション-interface-switching-at-runtime – haakym

答えて

1

Imho、それを行う方法はたくさんあります。

まず、サービスコンテナのcontextual bindingを見てください。チェックアウト手順で異なるクラスを使用している場合は、実際に契約を使用しているユーザーに基づいて解決戦略を設定できます。

しかし、おそらく私は別のものを選ぶでしょう。

これにはstrategy design patternを適用しましょう。

基本的には、2つの段階に分けて:

  • 、例えば、BillingManagerの名前 "トップ" クラスを作成します。
  • お支払い方法を実装する各支払いタイプ(imho、paypal()およびstripe()メソッドを1つのクラスにするのは間違っていますbecause of this)のクラスです。このインタフェースに 'process($ orderId) `メソッドがあるとします。

今、BillingManagerクラスが呼び出されます。おそらく、一般的なメソッドpayを呼び出し、パラメータとして、どのような戦略を使用するかを理解することになります。もちろん

public function pay($strategy, $orderId) { 
    // use $strategy to understand which service must be used. 
    // very raw example: 

    $strategy = app()->make($strategy . 'Strategy'); 
    $strategy->process($orderId); 
} 

よう

何か、あなたが使用する必要がありますどのようなサービスを理解するために安全なメカニズムが必要になります。その後、毎回BillingManagerクラスを使用することができ、さまざまな支払いシステムがあり、何も心配する必要はありません。

関連する問題