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.

versiyon: 3.x