DI Konteynerini Yapılandırma

Nette DI konteyneri için yapılandırma seçeneklerine genel bakış.

Yapılandırma dosyası

Nette DI konteynerinin yapılandırma dosyaları kullanılarak kontrol edilmesi kolaydır. Genellikle NEON formatında yazılırlar. Düzenleme için bu formatı destekleyen editörler kullanmanızı öneririz.

 decorator: 	Dekoratör
di: DI Konteyner
extensions: Ek DI uzantılarını yükleyin
includes: Including files
parameters: Parameters
search: Otomatik hizmet kaydı
services: Services

%, you must escape it by doubling it to %% karakterini içeren bir dize yazmak için.

Parametreler

Daha sonra hizmet tanımlarının bir parçası olarak kullanılabilecek parametreler tanımlayabilirsiniz. Bu, daha düzenli olarak değiştirmek isteyeceğiniz değerleri ayırmanıza yardımcı olabilir.

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

Herhangi bir yapılandırma dosyasının başka bir yerinde %foo% aracılığıyla foo parametresine başvurabilirsiniz. Ayrıca '%wwwDir%/images' gibi dizgilerin içinde de kullanılabilirler.

Parametrelerin sadece string olması gerekmez, dizi değerleri de olabilirler:

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

Tek tuşa %mailer.user% olarak başvurabilirsiniz.

Kodunuzda, örneğin sınıfınızda herhangi bir parametrenin değerini almanız gerekiyorsa, o zaman bu sınıfa geçirin. Örneğin, yapıcıda. Sınıfların parametre değerlerini sorgulayabileceği global bir yapılandırma nesnesi yoktur. Bu, bağımlılık enjeksiyonu ilkesine aykırı olacaktır.

Hizmetler

Ayrı bir bölüme bakınız.

Dekoratör

Belirli bir türdeki tüm hizmetleri toplu olarak nasıl düzenleyebilirim? Belirli bir ortak atadan miras kalan tüm sunucular için belirli bir yöntemi çağırmanız mı gerekiyor? İşte dekoratörün geldiği yer burasıdır.

decorator:
	# bu sınıfın veya arayüzün örneği olan tüm hizmetler için
	App\Presenters\BasePresenter:
		setup:
			- setProjectId(10)     # bu yöntemi çağır
			- $absoluteUrls = true # ve değişkeni ayarlayın

Dekoratör ayrıca etiketleri ayarlamak veya enjeksiyon modunu açmak için de kullanılabilir.

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

DI

DI konteynerinin teknik ayarları.

di:
	# Tracy Bar'da DIC gösteriyor mu?
	debugger: ...        # (bool) varsayılan değer true

	# asla otomatik bağlamadığınız parametre türleri
	excluded: ...        # (string[])

	# DI konteynerinin miras aldığı sınıf
	parentClass: ...     # (string) varsayılan olarak Nette\DI\Container

Meta Veri Aktarımı

DI konteyner sınıfı ayrıca çok fazla meta veri içerir. Meta veri dışa aktarımını azaltarak bunu azaltabilirsiniz.

di:
	export:
		# parametreleri dışa aktarmak için?
		parameters: false   # (bool) varsayılan değer true

		# etiketleri dışa aktarın ve hangileri?
		tags:               # (string[]|bool) varsayılan tüm
			- event.subscriber

		# otomatik kablolama için verileri dışa aktar ve hangisi?
		types:              # (string[]|bool) varsayılan tüm
			- Nette\Database\Connection
			- Symfony\Component\Console\Application

$container->getParameters() dizisini kullanmıyorsanız, parametre dışa aktarımını devre dışı bırakabilirsiniz. Ayrıca, yalnızca $container->findByTag(...) yöntemini kullanarak hizmet aldığınız etiketleri dışa aktarabilirsiniz. Yöntemi hiç çağırmazsanız, false ile etiket dışa aktarımını tamamen devre dışı bırakabilirsiniz.

Kullandığınız sınıfları $container->getByType() yöntemine parametre olarak belirterek otomatik kablolama için meta verileri önemli ölçüde azaltabilirsiniz. Ve yine, yöntemi hiç çağırmazsanız (veya Nette\Application\Application adresini almak için yalnızca bootstrap içinde çağırırsanız), false ile dışa aktarmayı tamamen devre dışı bırakabilirsiniz.

Uzantılar

Diğer DI uzantılarının kaydı. Bu şekilde, örneğin Dibi\Bridges\Nette\DibiExtension22 DI uzantısını dibi adı altında ekleriz:

extensions:
	dibi: Dibi\Bridges\Nette\DibiExtension22

Daha sonra dibi adlı bölümde yapılandırıyoruz:

dibi:
	host: localhost

Parametreli bir uzantı sınıfı da ekleyebilirsiniz:

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

Dosyalar Dahil

Ek yapılandırma dosyaları includes bölümüne eklenebilir:

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

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

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

Aynı anahtarlara sahip öğeler yapılandırma dosyalarında görünürse, diziler söz konusu olduğunda bunların üzerine yazılır veya birleştirilir. Daha sonra dahil edilen dosyanın bir öncekinden daha yüksek önceliği vardır. includes bölümünün listelendiği dosya, içine dahil edilen dosyalardan daha yüksek önceliğe sahiptir.

Hizmetlerin DI konteynerine otomatik olarak eklenmesi, çalışmayı son derece keyifli hale getirir. Nette, kapsayıcıya otomatik olarak sunucuları ekler, ancak diğer sınıfları kolayca ekleyebilirsiniz.

Sınıfların hangi dizinlerde (ve alt dizinlerde) aranması gerektiğini belirtmeniz yeterlidir:

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

Ancak genellikle, 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 aşağıdaki sınıflardan en az birini miras alan veya uygulayan sınıfları seçebiliriz:

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

Ayrıca negatif kurallar da tanımlayabilirsiniz, yani sınıf adı maskeleri veya ataları ve bunlara uymaları halinde hizmet DI konteynerine eklenmeyecektir:

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

Eklenen hizmetler için etiketler belirlenebilir:

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

Birleştirme

Aynı anahtarlara sahip öğeler daha fazla yapılandırma dosyasında görünüyorsa, diziler söz konusu olduğunda bunların üzerine yazılır veya birleştirilir. Daha sonra dahil edilen dosya daha yüksek önceliğe sahiptir.

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

Belirli bir dizinin birleştirilmesini önlemek için dizinin adından hemen sonra ünlem işareti kullanın:

config1.neon config2.neon Sonuç
items:
	- 1
	- 2
items!:
	- 3
items:
	- 3
versiyon: 3.x