”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 使用工厂模式在 Laravel 中动态选择支付处理器

使用工厂模式在 Laravel 中动态选择支付处理器

发布于2024-11-04
浏览:962

Dynamic Payment Processor Selection in Laravel  Using the Factory Pattern

在之前的文章中,我们探索了 Laravel 中处理付款处理的两种不同方法:

  • 硬编码服务绑定
  • 上下文绑定。

虽然这两种方法都很有效,但在根据运行时条件(例如用户输入、配置设置)动态选择支付处理器时它们都有其局限性。

在第三部分也是最后一部分中,我们将研究一种更灵活的方法:使用工厂模式。这种设计模式允许我们根据上下文选择适当的 PaymentProcessorInterface 实现(例如,根据请求在 Stripe 或 PayPal 之间进行选择)。

实施工厂模式

工厂模式提供了一个可扩展的解决方案,可以在运行时动态解决不同的实现。以下是逐步设置的方法。

第1步:创建工厂接口

首先,让我们定义一个 PaymentProcessorFactoryInterface,它概述了如何解析不同的支付处理器。





这个接口确保我们创建的任何工厂都有一个 getProcessor 方法,负责根据提供的参数(例如“stripe”或“paypal”)返回适当的支付处理器。

第 2 步:创建工厂实现

接下来,我们将实现根据提供商输入解析适当支付处理器的工厂。





该工厂根据运行时提供的输入动态选择正确的支付处理器。在此示例中,我们直接返回 StripePaymentProcessor 和 PayPalPaymentProcessor 的新实例。如果需要,这些类也可以从 Laravel 的服务容器中解析,以便更好的管理。

第 3 步:实施 Stripe 和 PayPal 处理器

确保您拥有实现 PaymentProcessorInterface 的 StripePaymentProcessor 和 PayPalPaymentProcessor 类。

示例:StripePaymentProcessor





示例:PayPalPaymentProcessor

同样,实现 PayPalPaymentProcessor 类,遵循与 StripePaymentProcessor 相同的模式。

第四步:在服务容器中绑定工厂

为了确保工厂在整个 Laravel 应用程序中可用,您需要将 PaymentProcessorFactory 绑定到 Laravel 的服务容器。您可以在 AppServiceProvider 中执行此操作。

在App\Providers\AppServiceProvider.php中,在register方法中添加以下内容:

public function register()
{
    $this->app->singleton(\App\Contracts\PaymentProcessorFactoryInterface::class, \App\Services\PaymentProcessorFactory::class);
}

此绑定告诉 Laravel 在请求 PaymentProcessorFactoryInterface 时使用 PaymentProcessorFactory,确保整个应用程序中只有一个工厂实例。

第 5 步:在控制器中使用工厂

现在工厂已经设置完毕,您可以将其注入控制器中,以根据运行时数据(例如请求输入)动态选择适当的支付处理器。

示例:PaymentController

paymentProcessorFactory = $paymentProcessorFactory;
    }

    public function makePayment(Request $request)
    {
        $provider = $request->input('provider'); // E.g., 'stripe' or 'paypal'
        $amount = $request->input('amount');
        $currency = $request->input('currency');
        $paymentDetails = $request->input('details');

        // Get the appropriate payment processor based on the provider
        $paymentProcessor = $this->paymentProcessorFactory->getProcessor($provider);

        // Use the selected payment processor to create a payment
        $response = $paymentProcessor->createPayment($amount, $currency, $paymentDetails);

        return response()->json($response);
    }
}

在此控制器中,我们通过依赖注入注入 PaymentProcessorFactoryInterface。当请求付款时,我们根据请求确定付款提供商(例如 Stripe 或 PayPal),将其传递给工厂,并动态解析适当的付款处理器。

第 6 步:处理不同的支付提供商

在此设置中,控制器现在可以通过简单地切换请求中的提供商名称来动态处理不同的支付提供商。当您需要处理多个支付网关而无需重复逻辑或将代码与特定实现紧密耦合时,此方法特别强大。

结论

在 Laravel 11 中使用工厂模式提供了一种高度灵活的方法来在运行时选择不同的支付处理器。以下是我们所涵盖的步骤的摘要:

  • 工厂接口和实现:创建了一个工厂,根据字符串输入动态解析正确的支付处理器。
  • 处理器实现:确保 StripePaymentProcessor 和 PayPalPaymentProcessor 类实现 PaymentProcessorInterface。
  • 服务容器绑定:将工厂绑定在服务容器中,以便在整个应用程序中轻松注入。 控制器中的动态选择:使用控制器内的工厂根据运行时数据动态选择和使用适当的支付处理器。

软件设计原则和设计模式

我们使用单个支付处理器开始这个由 3 部分组成的教程,并进行硬编码选择,然后我们通过 Laravel 服务容器绑定使用代码内(“编译时”)配置,然后在这部分中我们不断重构设计牢记原则和设计模式,这使我们能够重构代码,实现:

  • 动态灵活性:工厂模式允许在运行时选择不同的支付处理器,使您的应用程序更加灵活和可扩展。
  • 松耦合:通过注入工厂,您的控制器与支付处理器松耦合,使得将来添加或更换支付网关变得更容易。
  • 可维护性:这种方法提供了更干净、更可维护的代码库,特别是在处理多种支付选项时。

通过此设置,我们现在拥有一个强大、灵活的系统来处理 Laravel 中的付款。如果我们需要支持额外的处理器,我们可以轻松扩展工厂来支持和修改选择提供者的逻辑,并处理不同的业务逻辑场景。

版本声明 本文转载于:https://dev.to/websilvercraft/dynamic-payment-processor-selection-in-laravel-11-using-the-factory-pattern-3pbd?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 对象拟合:IE和Edge中的封面失败,如何修复?
    对象拟合:IE和Edge中的封面失败,如何修复?
    To resolve this issue, we employ a clever CSS solution that solves the problem:position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%)...
    编程 发布于2025-04-09
  • 找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    如何在mySQL中使用mySql 检索最大计数,您可能会遇到一个问题,您可能会在尝试使用以下命令:理解错误正确找到由名称列分组的值的最大计数,请使用以下修改后的查询: 计数(*)为c 来自EMP1 按名称组 c desc订购 限制1 查询说明 select语句提取名称列和每个名称...
    编程 发布于2025-04-09
  • HTML格式标签
    HTML格式标签
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    编程 发布于2025-04-09
  • 如何使用Java.net.urlConnection和Multipart/form-data编码使用其他参数上传文件?
    如何使用Java.net.urlConnection和Multipart/form-data编码使用其他参数上传文件?
    使用http request 上传文件上传到http server,同时也提交其他参数,java.net.net.urlconnection and Multipart/form-data Encoding是普遍的。 Here's a breakdown of the process:Mu...
    编程 发布于2025-04-09
  • 如何实时捕获和流媒体以进行聊天机器人命令执行?
    如何实时捕获和流媒体以进行聊天机器人命令执行?
    在开发能够执行命令的chatbots的领域中,实时从命令执行实时捕获Stdout,一个常见的需求是能够检索和显示标准输出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
    编程 发布于2025-04-09
  • 为什么不使用CSS`content'属性显示图像?
    为什么不使用CSS`content'属性显示图像?
    在Firefox extemers属性为某些图像很大,&& && && &&华倍华倍[华氏华倍华氏度]很少见,却是某些浏览属性很少,尤其是特定于Firefox的某些浏览器未能在使用内容属性引用时未能显示图像的情况。这可以在提供的CSS类中看到:。googlepic { 内容:url(&#...
    编程 发布于2025-04-09
  • 如何在其容器中为DIV创建平滑的左右CSS动画?
    如何在其容器中为DIV创建平滑的左右CSS动画?
    通用CSS动画,用于左右运动 ,我们将探索创建一个通用的CSS动画,以向左和右移动DIV,从而到达其容器的边缘。该动画可以应用于具有绝对定位的任何div,无论其未知长度如何。问题:使用左直接导致瞬时消失 更加流畅的解决方案:混合转换和左 [并实现平稳的,线性的运动,我们介绍了线性的转换。这...
    编程 发布于2025-04-09
  • 哪种在JavaScript中声明多个变量的方法更可维护?
    哪种在JavaScript中声明多个变量的方法更可维护?
    在JavaScript中声明多个变量:探索两个方法在JavaScript中,开发人员经常遇到需要声明多个变量的需要。对此的两种常见方法是:在单独的行上声明每个变量: 当涉及性能时,这两种方法本质上都是等效的。但是,可维护性可能会有所不同。 第一个方法被认为更易于维护。每个声明都是其自己的语句,使其...
    编程 发布于2025-04-09
  • 可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    [2这里: https://webthemez.com/demo/sticky-multi-header-scroll/index.html </main> <section> { display:grid; grid-template-...
    编程 发布于2025-04-09
  • 如何使用Python理解有效地创建字典?
    如何使用Python理解有效地创建字典?
    在python中,词典综合提供了一种生成新词典的简洁方法。尽管它们与列表综合相似,但存在一些显着差异。与问题所暗示的不同,您无法为钥匙创建字典理解。您必须明确指定键和值。 For example:d = {n: n**2 for n in range(5)}This creates a dicti...
    编程 发布于2025-04-09
  • 您可以使用CSS在Chrome和Firefox中染色控制台输出吗?
    您可以使用CSS在Chrome和Firefox中染色控制台输出吗?
    在javascript console 中显示颜色是可以使用chrome的控制台显示彩色文本,例如红色的redors,for for for for错误消息?回答是的,可以使用CSS将颜色添加到Chrome和Firefox中的控制台显示的消息(版本31或更高版本)中。要实现这一目标,请使用以下模...
    编程 发布于2025-04-09
  • 如何处理PHP文件系统功能中的UTF-8文件名?
    如何处理PHP文件系统功能中的UTF-8文件名?
    在PHP的Filesystem functions中处理UTF-8 FileNames 在使用PHP的MKDIR函数中含有UTF-8字符的文件很多flusf-8字符时,您可能会在Windows Explorer中遇到comploreer grounder grounder grounder gro...
    编程 发布于2025-04-09
  • 如何干净地删除匿名JavaScript事件处理程序?
    如何干净地删除匿名JavaScript事件处理程序?
    删除匿名事件侦听器将匿名事件侦听器添加到元素中会提供灵活性和简单性,但是当要删除它们时,可以构成挑战,而无需替换元素本身就可以替换一个问题。 element? element.addeventlistener(event,function(){/在这里工作/},false); 要解决此问题,请考虑...
    编程 发布于2025-04-09
  • Android如何向PHP服务器发送POST数据?
    Android如何向PHP服务器发送POST数据?
    在android apache httpclient(已弃用) httpclient httpclient = new defaulthttpclient(); httppost httppost = new httppost(“ http://www.yoursite.com/script.p...
    编程 发布于2025-04-09
  • \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    答案: 在大多数现代编译器中,while(1)和(1)和(;;)之间没有性能差异。编译器: perl: 1 输入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    编程 发布于2025-04-09

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3