在我们之前的文章(如何在 Laravel 11 中添加和实现支付处理接口:硬编码绑定)中,我们通过硬编码 PaymentProcessorInterface 之间的绑定探索了设置支付处理器的第一步以及具体的实现,例如 StripePaymentProcessor。
虽然这种方法对于小型应用程序来说简单有效,但对于更复杂的场景(您可能需要处理多个支付网关)缺乏灵活性,但通过使用接口,我们可以解耦代码,以便我们可以进一步扩展它,按照开闭原则,注入适当的功能:
在第二部分中,我们将深入研究上下文绑定,这是 Laravel 服务容器中的一种更高级的技术,它允许您根据特定上下文注入接口的不同实现。当支付处理器的选择取决于应用程序状态(例如哪个控制器正在处理请求)时,这非常有用。
Laravel 中的上下文绑定允许服务容器根据请求的类或上下文注入接口的不同实现。我们可以使用上下文绑定来根据控制器或其他上下文因素解析不同的支付处理器,而不是依赖于单一的硬编码实现。
让我们从在 AppServiceProvider 中配置上下文绑定开始。我们将根据请求的控制器绑定不同的支付处理器。例如,StripePaymentController 将使用 StripePaymentProcessor,PayPalPaymentController 将使用 PayPalPaymentProcessor。
具体操作方法如下:
use App\Contracts\PaymentProcessorInterface; use App\Services\StripePaymentProcessor; use App\Services\PayPalPaymentProcessor; 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); }
这里发生了什么?
通过上下文绑定,每个控制器现在可以自动注入其专用的支付处理器。以下是设置控制器的方法:
示例:StripePaymentController
use App\Contracts\PaymentProcessorInterface; class StripePaymentController extends Controller { protected $paymentProcessor; public function __construct(PaymentProcessorInterface $paymentProcessor) { $this->paymentProcessor = $paymentProcessor; } // Methods to handle Stripe-specific payments... }
示例:PayPalPaymentController
use App\Contracts\PaymentProcessorInterface; 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 中使用工厂进行支付处理!
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3