在 Laravel 11 中的支付处理编译时实现上下文绑定
在我们之前的文章(如何在 laravel 11 中添加和实现支付处理接口:硬编码绑定)中,我们通过硬编码 paymentprocessorinterface 和特定实现(如 stripepaymentprocessor)之间的绑定来探索设置支付处理器的第一步。
虽然这种方法对于小型应用程序来说简单有效,但对于更复杂的场景(您可能需要处理多个支付网关)缺乏灵活性,但通过使用接口,我们可以解耦代码,以便我们可以进一步扩展它,按照开闭原则,注入适当的功能:
在第二部分中,我们将深入研究上下文绑定,这是 laravel 服务容器中的一种更高级的技术,它允许您根据特定上下文注入接口的不同实现。当支付处理器的选择取决于应用程序状态(例如哪个控制器正在处理请求)时,这非常有用。
第 1 步:了解上下文绑定
laravel 中的上下文绑定允许服务容器根据请求的类或上下文注入接口的不同实现。我们可以使用上下文绑定来根据控制器或其他上下文因素来解析不同的支付处理器,而不是依赖于单一的硬编码实现。
步骤 2:appserviceprovider 中的上下文绑定
我们首先在 appserviceprovider 中配置上下文绑定。我们将根据请求的控制器绑定不同的支付处理器。例如,stripepaymentcontroller 将使用 stripepaymentprocessor,paypalpaymentcontroller 将使用 paypalpaymentprocessor。
具体操作方法如下:
use appcontractspaymentprocessorinterface;use appservicesstripepaymentprocessor;use appservicespaypalpaymentprocessor;public function register(){ $this->app->when(stripepaymentcontroller::class) ->needs(paymentprocessorinterface::class) ->give(stripepaymentprocessor::class); $this->app->when(paypalpaymentcontroller::class) ->needs(paymentprocessorinterface::class) ->give(paypalpaymentprocessor::class);}
这里发生了什么?
第 3 步:每种付款方式单独的控制器
通过上下文绑定,每个控制器现在可以自动注入其专用的支付处理器。以下是设置控制器的方法:
示例:stripepaymentcontroller
use appcontractspaymentprocessorinterface;class stripepaymentcontroller extends controller{ protected $paymentprocessor; public function __construct(paymentprocessorinterface $paymentprocessor) { $this->paymentprocessor = $paymentprocessor; } // methods to handle stripe-specific payments...}
示例:paypalpaymentcontroller
use AppContractsPaymentProcessorInterface;class PayPalPaymentController extends Controller{ protected $paymentProcessor; public function __construct(PaymentProcessorInterface $paymentProcessor) { $this->paymentProcessor = $paymentProcessor; } // Methods to handle PayPal-specific payments...}
在这两个示例中,laravel 根据控制器上下文自动注入正确的支付处理器。这要归功于 appserviceprovider 中设置的上下文绑定。
为什么要使用上下文绑定?
当您知道根据特定类或上下文(例如控制器)使用哪个接口实现时,上下文绑定特别有用。它有助于保持代码整洁和易于管理,特别是在处理多个支付网关时,每个网关都有自己的控制器。
结论
在这篇文章中,我们探讨了如何在 laravel 11 中实现上下文绑定以进行支付处理。以下是此方法的好处的快速回顾:
在下一篇文章中,我们将探索工厂模式,它允许在运行时动态选择支付处理器,为复杂的应用程序提供更大的灵活性。
请继续关注下一部分,我们将介绍如何在 laravel 11 中使用工厂进行支付处理!