Nette DI Konteyner
Nette DI, Nette'nin en ilginç kütüphanelerinden biridir. Son derece hızlı ve şaşırtıcı derecede kolay yapılandırılabilen derlenmiş DI konteynerlerini üretebilir ve otomatik olarak güncelleyebilir.
DI konteynerinin oluşturması gereken servislerin şeklini genellikle NEON formatı yapılandırma dosyaları kullanarak tanımlarız. önceki bölümde manuel olarak oluşturduğumuz konteyner şöyle yazılırdı:
parameters:
db:
dsn: 'mysql:'
user: root
password: '***'
services:
- Nette\Database\Connection(%db.dsn%, %db.user%, %db.password%)
- ArticleFactory
- UserController
Yazım gerçekten kısa ve özdür.
ArticleFactory
ve UserController
sınıflarının yapıcılarında bildirilen tüm bağımlılıklar,
Nette DI tarafından sözde autowiring sayesinde otomatik
olarak bulunur ve iletilir, bu nedenle yapılandırma dosyasında hiçbir şey belirtmeye gerek yoktur. Bu nedenle, parametreler
değişse bile yapılandırmada hiçbir şeyi değiştirmeniz gerekmez. Nette konteyneri otomatik olarak yeniden oluşturur. Orada
tamamen uygulama geliştirmeye odaklanabilirsiniz.
Bağımlılıkları setter'lar kullanarak iletmek istiyorsak, bunun için setup bölümünü kullanırız.
Nette DI, konteynerin PHP kodunu doğrudan üretir. Sonuç, açıp inceleyebileceğiniz bir .php
dosyasıdır. Bu
sayede konteynerin tam olarak nasıl çalıştığını görebilirsiniz. Ayrıca IDE'de hata ayıklayabilir ve adım adım
ilerleyebilirsiniz. Ve en önemlisi: üretilen PHP son derece hızlıdır.
Nette DI ayrıca sağlanan arayüze dayalı olarak fabrikalar için kod üretebilir. Bu nedenle,
ArticleFactory
sınıfı yerine uygulamada sadece bir arayüz oluşturmamız yeterli olacaktır:
interface ArticleFactory
{
function create(): Article;
}
Örneğin tamamını GitHub'da bulabilirsiniz.
Bağımsız Kullanım
Nette DI kütüphanesini bir uygulamaya dağıtmak çok kolaydır. Önce Composer ile kurarız (çünkü zip indirmek çooook eski moda):
composer require nette/di
Aşağıdaki kod, config.neon
dosyasında saklanan yapılandırmaya göre bir DI konteyneri örneği
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 üretilir, kodu önbelleğe (__DIR__ . '/temp'
dizini) yazılır ve sonraki isteklerde
yalnızca buradan yüklenir.
Servisleri oluşturmak ve almak için getService()
veya getByType()
metotları kullanılır. Bu
şekilde UserController
nesnesini oluştururuz:
$controller = $container->getByType(UserController::class);
$controller->someMethod();
Geliştirme sırasında, herhangi bir sınıf veya yapılandırma dosyası değiştiğinde konteynerin otomatik olarak yeniden
oluşturulduğu otomatik yenileme modunu etkinleştirmek faydalıdır. ContainerLoader
yapıcısında ikinci argüman
olarak true
belirtmek yeterlidir.
$loader = new Nette\DI\ContainerLoader(__DIR__ . '/temp', true);
Nette Framework ile Kullanım
Gösterdiğimiz gibi, Nette DI kullanımı Nette Framework ile yazılmış uygulamalarla sınırlı değildir, sadece 3 satır kodla herhangi bir yere dağıtabilirsiniz. Ancak, Nette Framework'te uygulamalar geliştiriyorsanız, konteynerin yapılandırılması ve oluşturulmasından Bootstrap sorumludur.