Laravel在服务提供商中绑定多个类别到一个合同

时间:2016-05-25 08:30:59

标签: laravel laravel-5.2

所以我想做的是让我的eccomerce网站处理Paypal和Stripe付款。但是,我不确定这是怎么做的。

这就是我所拥有的。



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。

知道我们如何实现这个目标吗?因此,当我们输入提示时,我们可以获得paypal或条纹。

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

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

1 个答案:

答案 0 :(得分:1)

Imho,有很多方法可以做到。

首先,看一下服务容器的contextual binding。如果您在结帐过程中使用不同的类,则可以根据实际使用合同的人设置解决策略。

但是,我可能会选择不同的东西。

我们将strategy design pattern应用于此。

基本上,分两个步骤:

  • 创建一个名为“top”的类,例如BillingManager;
  • 实施结算界面的每种付款类型的类(imho,在单个类中生成paypal()stripe()方法错误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课程,使用许多不同的付款系统,而无需担心任何其他问题。