首页  >  文章  >  后端开发  >  使用工厂模式在 Laravel 中动态选择支付处理器

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

Susan Sarandon
Susan Sarandon原创
2024-10-03 18:07:02287浏览

Dynamic Payment Processor Selection in Laravel  Using the Factory Pattern

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

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

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

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

实现工厂模式

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

第1步:创建工厂接口

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

<?php

namespace App\Contracts;

interface PaymentProcessorFactoryInterface
{
    public function getProcessor(string $provider): PaymentProcessorInterface;
}

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

第 2 步:创建工厂实现

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

<?php

namespace App\Services;

use App\Contracts\PaymentProcessorInterface;
use App\Contracts\PaymentProcessorFactoryInterface;
use App\Services\StripePaymentProcessor;
use App\Services\PayPalPaymentProcessor;

class PaymentProcessorFactory implements PaymentProcessorFactoryInterface
{
    public function getProcessor(string $provider): PaymentProcessorInterface
    {
        switch ($provider) {
            case 'stripe':
                return new StripePaymentProcessor(); // Can be resolved via the container if needed
            case 'paypal':
                return new PayPalPaymentProcessor(); // Can also be resolved via the container
            default:
                throw new \Exception("Unsupported payment provider: $provider");
        }
    }
}

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

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

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

示例:StripePaymentProcessor

<?php

namespace App\Services;

use App\Contracts\PaymentProcessorInterface;

class StripePaymentProcessor implements PaymentProcessorInterface
{
    public function createPayment(float $amount, string $currency, array $paymentDetails): array
    {
        // Stripe-specific implementation
    }

    public function processPayment(array $paymentData): array
    {
        // Stripe-specific implementation
    }

    public function refundPayment(string $transactionId, float $amount): bool
    {
        // Stripe-specific implementation
    }
}

示例:PayPalPaymentProcessor

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

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

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

在AppProvidersAppServiceProvider.php中,在register方法中添加以下内容:

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

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

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

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

示例:PaymentController

<?php

namespace App\Http\Controllers;

use App\Contracts\PaymentProcessorFactoryInterface;
use Illuminate\Http\Request;

class PaymentController extends Controller
{
    protected $paymentProcessorFactory;

    public function __construct(PaymentProcessorFactoryInterface $paymentProcessorFactory)
    {
        $this->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 中的付款。如果我们需要支持额外的处理器,我们可以轻松扩展工厂来支持和修改选择提供者的逻辑,并处理不同的业务逻辑场景。

以上是使用工厂模式在 Laravel 中动态选择支付处理器的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn