Laravel Failover Yapısı Kullanımı

Laravel Failover Yapısı Kullanımı

·

3 min read

Merhaba Laravel geliştiricileri! Bu yazıda, projelerimizde farklı ödeme sağlayıcılarını kullanarak kesintisiz bir ödeme akışı oluşturmak için nasıl failover (yedekleme) yapısı kurabileceğimizi anlatacağım. Failover yapısı, bir sağlayıcı arızalandığında veya çalışmadığında sıradaki sağlayıcıyı devreye sokarak ödeme işlemlerinin kesintisiz ilerlemesini sağlar.

Neden Failover Yapısına İhtiyaç Var?

Tek bir ödeme sağlayıcısına bağımlı kalmak, o sağlayıcıda yaşanabilecek bir kesinti durumunda kullanıcıların işlem yapamamasıyla sonuçlanabilir. Failover yapısı, farklı ödeme sağlayıcıları arasında otomatik geçiş sağlayarak bu riski azaltır. Böylece ödemelerde kesinti olmadan hizmet sunmaya devam edebilirsiniz.

Laravel ile Failover Yapısı Nasıl Kurulur?

Bu yapıyı kurmak için aşağıdaki adımları izleyebiliriz:

1. PaymentGatewayInterface Arayüzünü Tanımlama

Öncelikle, tüm ödeme sağlayıcıları için ortak olacak bir arayüz (PaymentGatewayInterface) oluşturalım. Bu arayüz, sağlayıcıların charge (ödeme yap) ve getName (sağlayıcı ismini getir) gibi metodları içermesini sağlayacak:

namespace App\Services;

interface PaymentGatewayInterface
{
    public function charge($amount);
    public function getName(): string;
}

2. Ödeme Sağlayıcı Sınıflarını Oluşturma

Ardından, her ödeme sağlayıcıyı temsil eden sınıflarımızı PaymentGatewayInterface arayüzünü implement edecek şekilde tanımlayalım. Örneğin XPaymentGateway ve YPaymentGateway sınıflarını şu şekilde oluşturabiliriz:

namespace App\Services;

class XPaymentGateway implements PaymentGatewayInterface
{
    public function charge($amount)
    {
        // XPaymentGateway üzerinden ödeme işlemi
        return "X ödeme sağlayıcısı ile ödeme başarılı.";
    }

    public function getName(): string
    {
        return 'XPaymentGateway';
    }
}

class YPaymentGateway implements PaymentGatewayInterface
{
    public function charge($amount)
    {
        // YPaymentGateway üzerinden ödeme işlemi
        return "Y ödeme sağlayıcısı ile ödeme başarılı.";
    }

    public function getName(): string
    {
        return 'YPaymentGateway';
    }
}

3. PaymentManager Sınıfı: Failover Yapısının Merkezi

PaymentManager sınıfı, ödeme sağlayıcıları arasında failover işlevini yönetecek. Bu sınıf, arayüzü implement eden ödeme sağlayıcıları arasında sırayla işlem yaparak ilk başarılı olanı kullanır:

namespace App\Services;

class PaymentManager
{
    protected $providers;

    public function __construct(array $providers)
    {
        $this->providers = $providers;
    }

    public function charge($amount)
    {
        foreach ($this->providers as $provider) {
            try {
                return $provider->charge($amount);
            } catch (\Exception $e) {
                // Hata kaydediliyor, sıradaki sağlayıcıya geçiliyor
                logger()->error("Provider failed: {$provider->getName()} - " . $e->getMessage());
            }
        }

        // Tüm sağlayıcılar başarısız olduysa istisna fırlat
        throw new \Exception("Tüm ödeme sağlayıcıları başarısız oldu.");
    }
}

4. Sağlayıcıları Service Container’a Kayıt Etme

Laravel’in Service Container’ında PaymentManager sınıfına sağlayıcıları tanımlayarak ödeme işlemlerinin failover yapısını kurabiliriz. Böylece PaymentManager çağrıldığında sağlayıcılar sırayla denenir:

// AppServiceProvider.php

use App\Services\XPaymentGateway;
use App\Services\YPaymentGateway;
use App\Services\PaymentManager;
use App\Services\PaymentGatewayInterface;

public function register()
{
    $this->app->bind(PaymentManager::class, function ($app) {
        return new PaymentManager([
            $app->make(XPaymentGateway::class),
            $app->make(YPaymentGateway::class),
        ]);
    });
}

5. PaymentManager Kullanımı

Controller içinde PaymentManager sınıfını çağırarak ödemeleri failover yapısı ile başlatabiliriz. İlk sağlayıcı başarısız olursa sıradaki sağlayıcıya geçecektir.

namespace App\Http\Controllers;

use App\Services\PaymentManager;

class OrderController extends Controller
{
    protected $paymentManager;

    public function __construct(PaymentManager $paymentManager)
    {
        $this->paymentManager = $paymentManager;
    }

    public function store()
    {
        try {
            $result = $this->paymentManager->charge(100);
            return response()->json(['message' => $result]);
        } catch (\Exception $e) {
            return response()->json(['error' => 'Ödeme işlemi başarısız.'], 500);
        }
    }
}

Failover yapısı sayesinde ödeme sağlayıcıları arasında kesintisiz bir geçiş yaparak, herhangi bir sağlayıcı arızalandığında sıradaki sağlayıcıyla ödemeyi tamamlayabiliriz. PaymentGatewayInterface ile sağlayıcıları standart bir yapıya kavuşturarak kolayca yeni sağlayıcı ekleyebilir veya mevcut sağlayıcıları değiştirebiliriz. Bu, projelerinizde ödemelerin kesintisiz devam etmesini sağlayarak kullanıcı deneyimini önemli ölçüde iyileştirir.

Bu yapıyı kullanarak, Laravel ile çok daha esnek ve sağlam bir ödeme akışı kurabilirsiniz.

Laravel Service Container ve Dependency Injection konularını daha derinlemesine öğrenmek istiyorsanız, Laravel Service Container ve Dependency Injection (DI) Kullanımı adlı makalemi incelemenizi öneririm.