使用工廠模式在 Laravel 中動態選擇支付處理器

Susan Sarandon
發布: 2024-10-03 18:07:02
原創
286 人瀏覽過

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中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板