Nette DI Konteyner
Nette DI, en ilginç Nette kütüphanelerinden biridir. Son derece hızlı ve yapılandırması inanılmaz derecede kolay olan derlenmiş DI kapsayıcılarını oluşturabilir ve otomatik olarak güncelleyebilir.
Bir DI konteyneri tarafından oluşturulacak servisler genellikle NEON formatında yapılandırma dosyaları kullanılarak tanımlanır. Bir önceki bölümde manuel olarak oluşturduğumuz konteyner aşağıdaki gibi yazılırdı:
parameters:
db:
dsn: 'mysql:'
user: root
password: '***'
services:
- Nette\Database\Connection(%db.dsn%, %db.user%, %db.password%)
- ArticleFactory
- UserController
Notasyon gerçekten çok kısa.
ArticleFactory
ve UserController
sınıflarının kurucularında bildirilen tüm bağımlılıklar,
otomatik bağlantı adı verilen özellik sayesinde Nette DI tarafından bulunur ve aktarılır, bu
nedenle yapılandırma dosyasında herhangi bir şey belirtmeye gerek yoktur. Dolayısıyla parametreler değişse bile
yapılandırmada herhangi bir değişiklik yapmanıza gerek yoktur. Nette konteyneri otomatik olarak yeniden oluşturacaktır. Siz
de tamamen uygulama geliştirmeye odaklanabilirsiniz.
Bağımlılıkları ayarlayıcıları kullanarak aktarmak istiyorsanız, bunu yapmak için kurulum bölümünü kullanın.
Nette DI, konteyner için PHP kodunu doğrudan oluşturacaktır. Sonuç olarak, açıp inceleyebileceğiniz bir
.php
dosyası ortaya çıkar. Bu, konteynerin tam olarak nasıl çalıştığını görmenizi sağlar. Ayrıca IDE'de
hata ayıklayabilir ve üzerinden geçebilirsiniz. Ve en önemlisi: üretilen PHP son derece hızlıdır.
Nette DI, sağlanan arayüze dayalı olarak fabrika kodu da üretebilir. Bu nedenle,
ArticleFactory
sınıfı yerine, uygulamada sadece bir arayüz oluşturmamız gerekir:
interface ArticleFactory
{
function create(): Article;
}
Örneğin tamamını GitHub'da bulabilirsiniz.
Bağımsız Kullanım
Nette DI kütüphanesini bir uygulamada kullanmak çok kolaydır. Önce Composer ile yüklüyoruz (çünkü zip dosyalarını indirmek çok eski):
composer require nette/di
Aşağıdaki kod, config.neon
dosyasında saklanan yapılandırmaya göre DI konteynerinin bir örneğini
oluşturur:
$loader = new Nette\DI\ContainerLoader(__DIR__ . '/temp');
$class = $loader->load(function ($compiler) {
$compiler->loadConfig(__DIR__ . '/config.neon');
});
$container = new $class;
Konteyner yalnızca bir kez oluşturulur, kodu önbelleğe ( __DIR__ . '/temp'
dizini) yazılır ve sonraki
isteklerde yalnızca oradan okunur.
getService()
veya getByType()
yöntemleri hizmetleri oluşturmak ve almak için kullanılır.
UserController
nesnesini bu şekilde oluşturuyoruz:
$database = $container->getByType(UserController::class);
$database->query('...');
Geliştirme sırasında, herhangi bir sınıf veya yapılandırma dosyası değiştirildiğinde konteynerin otomatik olarak
yeniden oluşturulduğu otomatik yenileme modunu etkinleştirmek yararlıdır. Sadece ContainerLoader
kurucusunda
ikinci argüman olarak true
girin.
$loader = new Nette\DI\ContainerLoader(__DIR__ . '/temp', true);
Nette Framework ile Kullanımı
Gösterdiğimiz gibi, Nette DI kullanımı Nette Framework'te yazılan uygulamalarla sınırlı değildir, sadece 3 satır kodla herhangi bir yere dağıtabilirsiniz. Ancak, Nette Framework'te uygulama geliştiriyorsanız, konteynerin yapılandırılması ve oluşturulması Bootstrap tarafından ele alınır.