Nette Documentation Preview

syntax
DI Container Yapılandırması
***************************

.[perex]
Nette DI container'ının yapılandırma seçeneklerine genel bakış.


Yapılandırma Dosyası
====================

Nette DI container, yapılandırma dosyalarıyla kolayca denetlenir. Bunlar genellikle [NEON biçiminde|neon:format] yazılır. Bu biçim için [destek sunan düzenleyicileri |tools:ide] kullanmanızı öneririz.

<pre>
"decorator .[prism-token prism-atrule]":[#Decorator]: 	"Decorator .[prism-token prism-comment]"<br>
"di .[prism-token prism-atrule]":[#DI]: 			"DI Container .[prism-token prism-comment]"<br>
"extensions .[prism-token prism-atrule]":[#Extension'lar]: 	"Ek DI extension'ları kur .[prism-token prism-comment]"<br>
"includes .[prism-token prism-atrule]":[#Dosyaları Dahil Etme]: 	"Dosyaları dahil etme .[prism-token prism-comment]"<br>
"parameters .[prism-token prism-atrule]":[#Parametreler]: 	"Parametreler .[prism-token prism-comment]"<br>
"search .[prism-token prism-atrule]":[#Search]: 		"Otomatik servis kaydı .[prism-token prism-comment]"<br>
"services .[prism-token prism-atrule]":[services]: 		"Servisler .[prism-token prism-comment]"
</pre>

.[note]
İçinde `%` karakteri geçen bir dize yazmak için onu iki katına çıkararak `%%` biçiminde kaçışlamalısınız.


Parametreler
============

Yapılandırmada, sonra servis tanımlarının bir parçası olarak kullanabileceğiniz parametreler tanımlayabilirsiniz. Bu, yapılandırmayı netleştirmenizi ya da değişebilecek değerleri tek bir yerde toplamanızı sağlar.

```neon
parameters:
	dsn: 'mysql:host=127.0.0.1;dbname=test'
	user: root
	password: secret
```

`dsn` parametresine yapılandırmanın herhangi bir yerinde `%dsn%` yazımıyla başvururuz. Parametreler `'%wwwDir%/images'` gibi dizelerin içinde de kullanılabilir.

Parametreler yalnızca dize ya da sayı olmak zorunda değildir, dizi de içerebilirler:

```neon
parameters:
	mailer:
		host: smtp.example.com
		secure: ssl
		user: franta@gmail.com
	languages: [cs, en, de]
```

Belirli bir anahtara `%mailer.user%` olarak başvururuz.

Kodunuzun (örneğin bir sınıfın) bir parametrenin değerine ihtiyacı varsa, onu sınıfa aktarın. Örneğin yapıcıda. Sınıfların parametre değerleri için sorgulayabileceği genel bir yapılandırma nesnesi yoktur. Bu, bağımlılık enjeksiyonu ilkesinin çiğnenmesi olurdu.


Servisler
=========

Bkz. [ayrı bölüm|services].


Decorator
=========

Belirli bir türdeki birden çok servisi aynı anda nasıl değiştirirsiniz? Örneğin belirli bir temel sınıftan türeyen tüm presenter'larda belirli bir metot nasıl çağrılır? Decorator işte bunun içindir.

```neon
decorator:
	# bu sınıfın ya da arayüzün örneği olan tüm servisler için
	App\Presentation\BasePresenter:
		setup:
			- setProjectId(10)       # bu metodu çağır
			- $absoluteUrls = true   # ve değişkeni ayarla
```

Decorator'lar [etiket |services#Etiketler] koymak ya da [inject kipini |services#Inject Kipi] açmak için de kullanılabilir.

```neon
decorator:
	InjectableInterface:
		tags: [mytag: 1]
		inject: true
```


DI
===

DI container'ının teknik ayarları.

```neon
di:
	# DIC, Tracy Bar'da gösterilsin mi?
	debugger: ...        # (bool) varsayılan otomatik saptama (Tracy varsa açık)

	# asla autowiring'e girmeyecek parametre türleri
	excluded: ...        # (string[])

	# tembel servis oluşturma açık olsun mu?
	lazy: ...            # (bool) varsayılan false

	# DI container'ın türeyeceği sınıf
	parentClass: ...     # (string) varsayılan Nette\DI\Container
```


Tembel Servisler .{data-version:3.2.4}
--------------------------------------

`lazy: true` ayarı, servislerin tembel (ertelenmiş) oluşturulmasını etkinleştirir. Yani servisler, DI container'dan istendikleri anda değil, ilk kullanıldıkları anda oluşturulur. Bu, uygulamanın açılışını hızlandırabilir ve bellek kullanımını azaltabilir; çünkü yalnızca ilgili istek için gerçekten gereken servisler oluşturulur.

Belirli bir servis için tembel oluşturma [ayarlanabilir |services#Tembel Servisler].

.[note]
Tembel nesneler yalnızca kullanıcı tanımlı sınıflarda kullanılabilir, PHP'nin iç sınıflarında kullanılamaz. PHP 8.4 ya da daha yenisini gerektirir.


Meta Veri Dışa Aktarımı
-----------------------

DI container sınıfı bolca meta veri de içerir. Meta veri dışa aktarımını azaltarak boyutunu küçültebilirsiniz.

```neon
di:
	export:
		# parametreler dışa aktarılsın mı?
		parameters: false   # (bool) varsayılan true

		# etiketler dışa aktarılsın mı, hangileri?
		tags:               # (string[]|bool) varsayılan hepsi
			- event.subscriber

		# autowiring verileri dışa aktarılsın mı, hangileri?
		types:              # (string[]|bool) varsayılan hepsi
			- Nette\Database\Connection
			- Symfony\Component\Console\Application
```

`$container->getParameters()` kullanmıyorsanız parametre dışa aktarımını kapatabilirsiniz. Ayrıca yalnızca `$container->findByTag(...)` ile servis almak için gerçekten kullandığınız etiketleri dışa aktarabilirsiniz. Bu metodu hiç çağırmıyorsanız etiket dışa aktarımını `false` ile tümüyle kapatabilirsiniz.

[Autowiring|autowiring] için meta veriyi, yalnızca `$container->getByType()` ile gerçekten istediğiniz sınıfları listeleyerek belirgin biçimde azaltabilirsiniz. Yine, bu metodu hiç çağırmıyorsanız (ya da yalnızca [bootstrap|application:bootstrapping] dosyasında, örneğin `Nette\Application\Application` almak için çağırıyorsanız), tür dışa aktarımını `false` ile tümüyle kapatabilirsiniz.


Extension'lar
=============

Ek DI extension'larının kaydı. Örneğin `Dibi\Bridges\Nette\DibiExtension3` DI extension'ını `dibi` adıyla böyle eklersiniz:

```neon
extensions:
	dibi: Dibi\Bridges\Nette\DibiExtension3
```

Sonra onu `dibi` bölümünde yapılandırırsınız:

```neon
dibi:
	host: localhost
```

Extension olarak parametreli bir sınıf da ekleyebilirsiniz:

```neon
extensions:
	application: Nette\Bridges\ApplicationDI\ApplicationExtension(%debugMode%, [%appDir%], %tempDir%/cache)
```


Dosyaları Dahil Etme
====================

Ek yapılandırma dosyaları `includes` bölümünde dahil edilebilir:

```neon
includes:
	- parameters.php
	- services.neon
	- presenters.neon
```

`parameters.php` adı yazım hatası değil; yapılandırma, onu dizi olarak döndüren bir PHP dosyasında da yazılabilir:

```php
<?php
return [
	'database' => [
		'main' => [
			'dsn' => 'sqlite::memory:',
		],
	],
];
```

Birden çok yapılandırma dosyasında aynı anahtarlara sahip öğeler bulunursa, üzerleri yazılır ya da dizilerde [birleştirilir |#Birleştirme]. Sonra dahil edilen dosyanın önceliği öncekinden yüksektir. `includes` bölümünün listelendiği dosyanın önceliği, içinde dahil edilen dosyalardan yüksektir.


Search
======

DI container'da servislerin otomatik kaydı geliştirmeyi belirgin biçimde kolaylaştırır. Nette presenter'ları container'a otomatik ekler, ama siz de başka herhangi bir sınıfı kolayca ekleyebilirsiniz.

Yalnızca sınıfların hangi dizinlerde (ve alt dizinlerinde) aranacağını belirtin:

```neon
search:
	-	in: %appDir%/Forms
	-	in: %appDir%/Model
```

Tek bir arama kuralına ihtiyacınız varsa listeyi atlayıp anahtarlarını doğrudan `search` altına yazabilirsiniz:

```neon
search:
	in: %appDir%
```

Ancak genellikle kesinlikle tüm sınıfları ve arayüzleri eklemek istemeyiz, bu yüzden onları filtreleyebiliriz:

```neon
search:
	-	in: %appDir%/Forms

		# dosya adına göre filtreleme (string|string[])
		files:
			- *Factory.php

		# sınıf adına göre filtreleme (string|string[])
		classes:
			- *Factory
```

Ya da listelenen sınıflardan en az birinden türeyen veya onu uygulayan sınıfları seçebiliriz:


```neon
search:
	-	in: %appDir%
		extends:
			- App\*Form
		implements:
			- App\*FormInterface
```

Sınıf adı maskeleri ya da atalar kullanarak dışlama kuralları da tanımlayabilirsiniz. Bir sınıf dışlama kuralına uyarsa DI container'a eklenmez:

```neon
search:
	-	in: %appDir%
		exclude:
			files: ...
			classes: ...
			extends: ...
			implements: ...
```

Otomatik kaydedilen tüm servislere etiket atanabilir:

```neon
search:
	-	in: %appDir%
		tags: ...
```

Search, sınıfların yanı sıra tek bir `create()` ya da `get()` metodu olan arayüzleri de [üretilen factory ya da accessor |factory] olarak kaydeder. Container'da aynı türden bir servis zaten kayıtlıysa o sınıflar atlanır; böylece kopya oluşmaz.


Birleştirme
===========

Birden çok yapılandırma dosyasında aynı anahtarlara sahip öğeler bulunursa, üzerleri yazılır ya da dizilerde birleştirilir. Sonra dahil edilen dosyanın önceliği öncekinden yüksektir.

<table class=table>
<tr>
	<th width=33%>config1.neon</th>
	<th width=33%>config2.neon</th>
	<th>sonuç</th>
</tr>
<tr>
	<td>
```neon
items:
	- 1
	- 2
```
	</td>
	<td>
```neon
items:
	- 3
```
	</td>
	<td>
```neon
items:
	- 1
	- 2
	- 3
```
	</td>
</tr>
</table>

Dizilerde birleştirme, anahtar adından sonra bir ünlem işareti eklenerek önlenebilir:

<table class=table>
<tr>
	<th width=33%>config1.neon</th>
	<th width=33%>config2.neon</th>
	<th>sonuç</th>
</tr>
<tr>
	<td>
```neon
items:
	- 1
	- 2
```
	</td>
	<td>
```neon
items!:
	- 3
```
	</td>
	<td>
```neon
items:
	- 3
```
	</td>
</tr>
</table>

{{maintitle: Bağımlılık Enjeksiyonu Yapılandırması}}

DI Container Yapılandırması

Nette DI container'ının yapılandırma seçeneklerine genel bakış.

Yapılandırma Dosyası

Nette DI container, yapılandırma dosyalarıyla kolayca denetlenir. Bunlar genellikle NEON biçiminde yazılır. Bu biçim için destek sunan düzenleyicileri kullanmanızı öneririz.

 decorator: 	Decorator
di: DI Container
extensions: Ek DI extension'ları kur
includes: Dosyaları dahil etme
parameters: Parametreler
search: Otomatik servis kaydı
services: Servisler

İçinde % karakteri geçen bir dize yazmak için onu iki katına çıkararak %% biçiminde kaçışlamalısınız.

Parametreler

Yapılandırmada, sonra servis tanımlarının bir parçası olarak kullanabileceğiniz parametreler tanımlayabilirsiniz. Bu, yapılandırmayı netleştirmenizi ya da değişebilecek değerleri tek bir yerde toplamanızı sağlar.

parameters:
	dsn: 'mysql:host=127.0.0.1;dbname=test'
	user: root
	password: secret

dsn parametresine yapılandırmanın herhangi bir yerinde %dsn% yazımıyla başvururuz. Parametreler '%wwwDir%/images' gibi dizelerin içinde de kullanılabilir.

Parametreler yalnızca dize ya da sayı olmak zorunda değildir, dizi de içerebilirler:

parameters:
	mailer:
		host: smtp.example.com
		secure: ssl
		user: franta@gmail.com
	languages: [cs, en, de]

Belirli bir anahtara %mailer.user% olarak başvururuz.

Kodunuzun (örneğin bir sınıfın) bir parametrenin değerine ihtiyacı varsa, onu sınıfa aktarın. Örneğin yapıcıda. Sınıfların parametre değerleri için sorgulayabileceği genel bir yapılandırma nesnesi yoktur. Bu, bağımlılık enjeksiyonu ilkesinin çiğnenmesi olurdu.

Servisler

Bkz. ayrı bölüm.

Decorator

Belirli bir türdeki birden çok servisi aynı anda nasıl değiştirirsiniz? Örneğin belirli bir temel sınıftan türeyen tüm presenter'larda belirli bir metot nasıl çağrılır? Decorator işte bunun içindir.

decorator:
	# bu sınıfın ya da arayüzün örneği olan tüm servisler için
	App\Presentation\BasePresenter:
		setup:
			- setProjectId(10)       # bu metodu çağır
			- $absoluteUrls = true   # ve değişkeni ayarla

Decorator'lar etiket koymak ya da inject kipini açmak için de kullanılabilir.

decorator:
	InjectableInterface:
		tags: [mytag: 1]
		inject: true

DI

DI container'ının teknik ayarları.

di:
	# DIC, Tracy Bar'da gösterilsin mi?
	debugger: ...        # (bool) varsayılan otomatik saptama (Tracy varsa açık)

	# asla autowiring'e girmeyecek parametre türleri
	excluded: ...        # (string[])

	# tembel servis oluşturma açık olsun mu?
	lazy: ...            # (bool) varsayılan false

	# DI container'ın türeyeceği sınıf
	parentClass: ...     # (string) varsayılan Nette\DI\Container

Tembel Servisler

lazy: true ayarı, servislerin tembel (ertelenmiş) oluşturulmasını etkinleştirir. Yani servisler, DI container'dan istendikleri anda değil, ilk kullanıldıkları anda oluşturulur. Bu, uygulamanın açılışını hızlandırabilir ve bellek kullanımını azaltabilir; çünkü yalnızca ilgili istek için gerçekten gereken servisler oluşturulur.

Belirli bir servis için tembel oluşturma ayarlanabilir.

Tembel nesneler yalnızca kullanıcı tanımlı sınıflarda kullanılabilir, PHP'nin iç sınıflarında kullanılamaz. PHP 8.4 ya da daha yenisini gerektirir.

Meta Veri Dışa Aktarımı

DI container sınıfı bolca meta veri de içerir. Meta veri dışa aktarımını azaltarak boyutunu küçültebilirsiniz.

di:
	export:
		# parametreler dışa aktarılsın mı?
		parameters: false   # (bool) varsayılan true

		# etiketler dışa aktarılsın mı, hangileri?
		tags:               # (string[]|bool) varsayılan hepsi
			- event.subscriber

		# autowiring verileri dışa aktarılsın mı, hangileri?
		types:              # (string[]|bool) varsayılan hepsi
			- Nette\Database\Connection
			- Symfony\Component\Console\Application

$container->getParameters() kullanmıyorsanız parametre dışa aktarımını kapatabilirsiniz. Ayrıca yalnızca $container->findByTag(...) ile servis almak için gerçekten kullandığınız etiketleri dışa aktarabilirsiniz. Bu metodu hiç çağırmıyorsanız etiket dışa aktarımını false ile tümüyle kapatabilirsiniz.

Autowiring için meta veriyi, yalnızca $container->getByType() ile gerçekten istediğiniz sınıfları listeleyerek belirgin biçimde azaltabilirsiniz. Yine, bu metodu hiç çağırmıyorsanız (ya da yalnızca bootstrap dosyasında, örneğin Nette\Application\Application almak için çağırıyorsanız), tür dışa aktarımını false ile tümüyle kapatabilirsiniz.

Extension'lar

Ek DI extension'larının kaydı. Örneğin Dibi\Bridges\Nette\DibiExtension3 DI extension'ını dibi adıyla böyle eklersiniz:

extensions:
	dibi: Dibi\Bridges\Nette\DibiExtension3

Sonra onu dibi bölümünde yapılandırırsınız:

dibi:
	host: localhost

Extension olarak parametreli bir sınıf da ekleyebilirsiniz:

extensions:
	application: Nette\Bridges\ApplicationDI\ApplicationExtension(%debugMode%, [%appDir%], %tempDir%/cache)

Dosyaları Dahil Etme

Ek yapılandırma dosyaları includes bölümünde dahil edilebilir:

includes:
	- parameters.php
	- services.neon
	- presenters.neon

parameters.php adı yazım hatası değil; yapılandırma, onu dizi olarak döndüren bir PHP dosyasında da yazılabilir:

<?php
return [
	'database' => [
		'main' => [
			'dsn' => 'sqlite::memory:',
		],
	],
];

Birden çok yapılandırma dosyasında aynı anahtarlara sahip öğeler bulunursa, üzerleri yazılır ya da dizilerde birleştirilir. Sonra dahil edilen dosyanın önceliği öncekinden yüksektir. includes bölümünün listelendiği dosyanın önceliği, içinde dahil edilen dosyalardan yüksektir.

DI container'da servislerin otomatik kaydı geliştirmeyi belirgin biçimde kolaylaştırır. Nette presenter'ları container'a otomatik ekler, ama siz de başka herhangi bir sınıfı kolayca ekleyebilirsiniz.

Yalnızca sınıfların hangi dizinlerde (ve alt dizinlerinde) aranacağını belirtin:

search:
	-	in: %appDir%/Forms
	-	in: %appDir%/Model

Tek bir arama kuralına ihtiyacınız varsa listeyi atlayıp anahtarlarını doğrudan search altına yazabilirsiniz:

search:
	in: %appDir%

Ancak genellikle kesinlikle tüm sınıfları ve arayüzleri eklemek istemeyiz, bu yüzden onları filtreleyebiliriz:

search:
	-	in: %appDir%/Forms

		# dosya adına göre filtreleme (string|string[])
		files:
			- *Factory.php

		# sınıf adına göre filtreleme (string|string[])
		classes:
			- *Factory

Ya da listelenen sınıflardan en az birinden türeyen veya onu uygulayan sınıfları seçebiliriz:

search:
	-	in: %appDir%
		extends:
			- App\*Form
		implements:
			- App\*FormInterface

Sınıf adı maskeleri ya da atalar kullanarak dışlama kuralları da tanımlayabilirsiniz. Bir sınıf dışlama kuralına uyarsa DI container'a eklenmez:

search:
	-	in: %appDir%
		exclude:
			files: ...
			classes: ...
			extends: ...
			implements: ...

Otomatik kaydedilen tüm servislere etiket atanabilir:

search:
	-	in: %appDir%
		tags: ...

Search, sınıfların yanı sıra tek bir create() ya da get() metodu olan arayüzleri de üretilen factory ya da accessor olarak kaydeder. Container'da aynı türden bir servis zaten kayıtlıysa o sınıflar atlanır; böylece kopya oluşmaz.

Birleştirme

Birden çok yapılandırma dosyasında aynı anahtarlara sahip öğeler bulunursa, üzerleri yazılır ya da dizilerde birleştirilir. Sonra dahil edilen dosyanın önceliği öncekinden yüksektir.

config1.neon config2.neon sonuç
items:
	- 1
	- 2
items:
	- 3
items:
	- 1
	- 2
	- 3

Dizilerde birleştirme, anahtar adından sonra bir ünlem işareti eklenerek önlenebilir:

config1.neon config2.neon sonuç
items:
	- 1
	- 2
items!:
	- 3
items:
	- 3