Laravel Service Container ve Dependency Injection (DI) Kullanımı
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.
Subscribe to my newsletter
Read articles from Onur Evren directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by