Laravel Service Container ve Dependency Injection (DI) Kullanımı

Onur EvrenOnur Evren
3 min read

Merhaba Laravel geliştiricileri! Bugün sizlere Laravel'de pek çok kişinin gözden kaçırdığı, fakat projelerimizi daha esnek ve sürdürülebilir hale getiren iki önemli konudan bahsedeceğim: Service Container ve Dependency Injection (DI). Bu yapılar, özellikle büyük ölçekli uygulamalarda işimizi oldukça kolaylaştırıyor.

Laravel'in güçlü Service Container yapısını kullanarak nasıl bağımlılıkları yönetebileceğimizi, sınıflar arası bağımlılıkları nasıl daha esnek hale getirebileceğimizi göstereceğim. Bu sayede kodumuz hem daha temiz hem de daha kolay değiştirilebilir olacak.

Bağımlılık Yönetimi Neden Önemli?

Diyelim ki bir e-ticaret projesi üzerinde çalışıyorsunuz ve sipariş işlemleri için bir ödeme sistemi entegre ettiniz. Normalde, ödeme işini OrderService sınıfı içinde halletmek isteyebilirsiniz. Fakat gelecekte ödeme sağlayıcınızı değiştirdiğinizde, sınıfınızın içindeki tüm PaymentGateway bağımlılığını da değiştirmek zorunda kalacaksınız. Bu gibi durumlarda Dependency Injection kullanarak sınıfınızı daha esnek hale getirebilirsiniz.

Örnek Üzerinden Gidelim: PaymentGateway ve OrderService

Öncelikle, bir ödeme işleyici (PaymentGateway) oluşturacağız. Ardından, bu sınıfı OrderService sınıfımıza enjekte ederek bağımlılık yönetiminin nasıl yapıldığını göreceğiz.

1. Adım: PaymentGateway Arayüzünü Tanımlama

İlk olarak, bir PaymentGatewayInterface arayüzü tanımlayacağız. Bu arayüz, ödeme işlemlerini gerçekleştiren sınıfımızın uyacağı kuralları belirleyecek. Yani, hangi ödeme sağlayıcısını kullanırsak kullanalım, aynı metod yapısına uymak zorunda kalacak.

// app/Services/PaymentGatewayInterface.php
namespace App\Services;

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

2. Adım: StripePaymentGateway Sınıfını Oluşturma

Ödeme işlemlerini gerçekleştiren bir StripePaymentGateway sınıfı tanımlayalım. Bu sınıf, PaymentGatewayInterface arayüzünü kullanarak tüm ödeme işlemlerini gerçekleştirecek.

// app/Services/StripePaymentGateway.php
namespace App\Services;

class StripePaymentGateway implements PaymentGatewayInterface
{
    public function charge($amount)
    {
        // Burada Stripe ödeme işlemi kodu olacak
        return "Charged {$amount} through Stripe.";
    }
}

3. Adım: Service Provider ile Bağımlılığı Tanımlama

Şimdi, Laravel’in Service Container yapısını kullanarak bağımlılığımızı uygulamaya enjekte edebiliriz. AppServiceProvider içerisinde, PaymentGatewayInterface ihtiyacı olduğunda Laravel'e otomatik olarak StripePaymentGateway sınıfını sağlamasını söyleyeceğiz.

// app/Providers/AppServiceProvider.php
namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Services\PaymentGatewayInterface;
use App\Services\StripePaymentGateway;

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->bind(PaymentGatewayInterface::class, StripePaymentGateway::class);
    }
}

4. Adım: OrderService Sınıfında Dependency Injection Kullanma

Artık OrderService sınıfında, PaymentGatewayInterface bağımlılığını doğrudan kullanabiliriz. Laravel, Service Container ile bu bağımlılığı otomatik olarak çözerek StripePaymentGateway sınıfını enjekte edecektir.

// app/Services/OrderService.php
namespace App\Services;

class OrderService
{
    protected $paymentGateway;

    public function __construct(PaymentGatewayInterface $paymentGateway)
    {
        $this->paymentGateway = $paymentGateway;
    }

    public function processOrder($amount)
    {
        return $this->paymentGateway->charge($amount);
    }
}

5. Adım: Controller'da OrderService Kullanımı

Son olarak, OrderController sınıfında OrderService sınıfını kullanabiliriz. OrderService içindeki PaymentGatewayInterface bağımlılığı otomatik olarak enjekte edildiği için ödeme işlemi gerçekleştirilmiş olacak.

// app/Http/Controllers/OrderController.php
namespace App\Http\Controllers;

use App\Services\OrderService;

class OrderController extends Controller
{
    protected $orderService;

    public function __construct(OrderService $orderService)
    {
        $this->orderService = $orderService;
    }

    public function store()
    {
        $result = $this->orderService->processOrder(100);
        return response()->json(['message' => $result]);
    }
}

Bu yapıyı kullanarak, projemizi daha modüler ve yönetilebilir hale getirdik. Örneğin, ileride ödeme sağlayıcısını değiştirmek istersek tek yapmamız gereken AppServiceProvider'daki sınıf eşlemesini güncellemek. Kodun geri kalanında hiçbir değişiklik yapmamız gerekmeyecek!

Laravel’de Dependency Injection ve Service Container kullanımı, büyük projelerde çok işimize yarayan bir yapı ve bu tür düzenlemeler kodumuzu hem daha esnek hem de sürdürülebilir kılıyor.

Umarım bu yazı, Laravel projelerinizde Dependency Injection ve Service Container konularını kullanırken işinize yarar. Laravel’in sunduğu bu güçlü yapıyı projelerinize entegre ederek daha kaliteli bir kod yapısına sahip olabilirsiniz.

0
Subscribe to my newsletter

Read articles from Onur Evren directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Onur Evren
Onur Evren