在先前的文章中,我們探討了 Laravel 中處理付款處理的兩種不同方法:
雖然這兩種方法都很有效,但在根據運行時條件(例如使用者輸入、組態設定)動態選擇支付處理器時它們都有其限制。
在第三部分也是最後一部分中,我們將研究一種更靈活的方法:使用工廠模式。這種設計模式允許我們根據上下文選擇適當的 PaymentProcessorInterface 實作(例如,根據請求在 Stripe 或 PayPal 之間進行選擇)。
工廠模式提供了一個可擴展的解決方案,可以在運行時動態解析不同的實作。以下是逐步設定的方法。
首先,讓我們定義一個 PaymentProcessorFactoryInterface,它概述瞭如何解析不同的支付處理器。
<?php namespace App\Contracts; interface PaymentProcessorFactoryInterface { public function getProcessor(string $provider): PaymentProcessorInterface; }
此介面確保我們創建的任何工廠都具有 getProcessor 方法,負責根據提供的參數(例如“stripe”或“paypal”)返回適當的支付處理器。
接下來,我們將實作工廠,根據提供者的輸入解析適當的支付處理器。
<?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 的服務容器中解析,以便更好的管理。
確保您擁有實作 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,確保整個應用程式中只有一個工廠實例。
現在工廠已經設定完畢,您可以將其註入控制器中,以根據運行時資料(例如請求輸入)動態選擇適當的支付處理器。
範例: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),將其傳遞給工廠,並動態解析適當的付款處理器。
在此設定中,控制器現在可以透過簡單地切換請求中的提供者名稱來動態處理不同的支付提供者。當您需要處理多個支付網關而無需重複邏輯或將程式碼與特定實作緊密耦合時,此方法特別強大。
在 Laravel 11 中使用工廠模式提供了一種高度靈活的方法來在運行時選擇不同的支付處理器。以下是我們所涉及步驟的摘要:
我們使用單一支付處理器開始這個由3 部分組成的教學課程,並進行硬編碼選擇,然後我們透過Laravel 服務容器綁定使用程式碼內(「編譯時」)配置,然後在這部分我們不斷重構設計牢記原則和設計模式,這使我們能夠重構程式碼,實作:
透過此設置,我們現在擁有一個強大、靈活的系統來處理 Laravel 中的付款。如果我們需要支援額外的處理器,我們可以輕鬆擴展工廠來支援和修改選擇提供者的邏輯,並處理不同的業務邏輯場景。
以上是使用工廠模式在 Laravel 中動態選擇支付處理器的詳細內容。更多資訊請關注PHP中文網其他相關文章!