Nette Documentation Preview

syntax
Nette DI Konteyner
******************

.[perex]
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 |neon:format] yapılandırma dosyaları kullanılarak tanımlanır. Bir [önceki bölümde |container] manuel olarak oluşturduğumuz konteyner aşağıdaki gibi yazılırdı:

```neon
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 |autowiring] 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 |services#setup] 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 |factory] kodu da üretebilir. Bu nedenle, `ArticleFactory` sınıfı yerine, uygulamada sadece bir arayüz oluşturmamız gerekir:

```php
interface ArticleFactory
{
	function create(): Article;
}
```

Örneğin tamamını [GitHub'da |https://github.com/nette-examples/di-example-doc] bulabilirsiniz.


Bağımsız Kullanım .[#toc-standalone-use]
----------------------------------------

Nette DI kütüphanesini bir uygulamada kullanmak çok kolaydır. Önce Composer ile yüklüyoruz (çünkü zip dosyalarını indirmek çok eski):

```shell
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:

```php
$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:

```php
$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.

```php
$loader = new Nette\DI\ContainerLoader(__DIR__ . '/temp', true);
```


Nette Framework ile Kullanımı .[#toc-using-it-with-the-nette-framework]
-----------------------------------------------------------------------

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 |application:bootstrap#toc-di-container-configuration] tarafından ele alınır.

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.