Bağımlılık enjeksiyonu nedir ve PHP geliştirmede nasıl uygulanır?
sobes.tech yapay zeka
AI'dan gelen yanıt
Bağımlılık Enjeksiyonu (DI), bir nesnenin bağımlılıklarını başka bir nesne veya framework'ten almasını sağlayan tasarım desenidir, kendisinin oluşturması yerine. Bu, sınıf bağımlılıklarının yönetimini kolaylaştırır ve kodu daha esnek, test edilebilir ve sürdürülebilir hale getirir.
PHP'de DI şu amaçlar için kullanılır:
- Bağlantıyı azaltma: Sınıflar, bağımlılıklarının belirli uygulamalarına sıkı sıkıya bağlı değildir.
- Birlik testi kolaylaştırma: Gerçek bağımlılıkların, testler için sahte nesnelerle kolayca değiştirilebilir.
- Esneklik ve genişletilebilirliği artırma: Bağımlılıkların uygulamalarını değiştirmek veya değiştirmek, onları kullanan sınıfı değiştirmeden kolaydır.
Bağımlılık enjeksiyonu için üç temel yaklaşım vardır:
-
Yapıcı (Constructor) aracılığıyla enjeksiyon: Bağımlılıklar, sınıfın yapıcı fonksiyonuna argüman olarak geçirilir. Bu, nesne oluşturulurken gerekli bağımlılıkların bulunmasını garanti ettiği için tercih edilen yoldur.
<?php class DatabaseConnection { // Veritabanı bağlantısı detayları } class UserRepository { private DatabaseConnection $db; public function __construct(DatabaseConnection $db) { $this->db = $db; } // Reposytory metodları } // Bağımlılık enjeksiyonu ile nesne oluşturma $db = new DatabaseConnection(); $userRepository = new UserRepository($db); -
Setter aracılığıyla enjeksiyon: Bağımlılıklar, genel erişilebilir setter metodları aracılığıyla enjekte edilir. Bu, bağımlılıkların opsiyonel olmasına izin verir.
<?php class Logger { // Günlük kaydı } class UserService { private ?Logger $logger = null; // Opsiyonel bağımlılık public function setLogger(Logger $logger): void { $this->logger = $logger; } public function doSomething(): void { if ($this->logger) { $this->logger->log("Bir şeyler yapılıyor..."); } // Ana mantık } } // Nesne oluşturma ve opsiyonel bağımlılık enjeksiyonu $userService = new UserService(); $logger = new Logger(); $userService->setLogger($logger); -
Arayüz aracılığıyla enjeksiyon: Bağımlılığı ihtiyaç duyan sınıf, bu bağımlılığı ayarlamak için bir metod tanımlayan bir arayüzü uygular. PHP'de diğerlerine kıyasla daha az yaygındır.
Gerçek PHP uygulamalarında, genellikle Bağımlılık Enjeksiyon Konteynerleri (Dependency Injection Containers) kullanılır. Bu, nesnelerin ve bağımlılıklarının otomatik olarak oluşturulmasını ve enjekte edilmesini sağlayan kütüphaneler veya frameworklerdir. Konteyner, bir sınıfın bağımlılıklarını analiz edebilir ve gerekli nesneleri otomatik olarak oluşturup enjekte edebilir.
PHP için popüler DI konteyner örnekleri:
- PHP-DI
- Symfony\DependencyInjection
- Laravel Servis Konteyneri (Laravel'e dahildir)
DI konteyner kullanımı:
<?php
// Pseudo-konteyner ile örnek
// Genellikle, konteyner yapılandırma dosyalarıyla (YAML, PHP dizileri vb.) yapılandırılır
// Konteyner yapılandırması (basitleştirilmiş)
$container->set(DatabaseConnection::class, function() {
return new DatabaseConnection(); // Nesne oluşturma
});
$container->set(UserRepository::class, function($container) {
// DatabaseConnection bağımlılığını enjekte ederek UserRepository oluşturma
return new UserRepository($container->get(DatabaseConnection::class));
});
// Nesneyi konteynerden al - konteyner otomatik olarak bağımlılıkları oluşturup enjekte eder
$userRepository = $container->get(UserRepository::class);
Özetle, PHP'de bağımlılık enjeksiyonu, esnek, test edilebilir ve sürdürülebilir kod inşa etmek için anahtar bir desen olup, büyük projelerde ve framework kullanırken özellikle önemlidir.