DI Konteyner Yapılandırması

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

Yapılandırma Dosyası

Nette DI konteyneri, yapılandırma dosyaları aracılığıyla kolayca kontrol edilir. Bunlar genellikle NEON formatı kullanılarak yazılır. Düzenleme için bu formatı destekleyen düzenleyiciler öneririz.

 decorator: 	Dekoratör
di: DI konteyner
extensions: Diğer DI uzantılarının kurulumu
includes: Dosya dahil etme
parameters: Parametreler
search: Servislerin otomatik kaydı
services: Servisler

% karakterini içeren bir karakter dizisi yazmak istiyorsanız, onu %% olarak iki katına çıkararak kaçış yapmanız gerekir.

Parametreler

Yapılandırmada, daha sonra servis tanımlarının bir parçası olarak kullanılabilecek parametreler tanımlayabilirsiniz. Bu sayede yapılandırmayı daha anlaşılır hale getirebilir veya değişecek değerleri birleştirebilir ve ayırabilirsiniz.

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

dsn parametresine yapılandırmanın herhangi bir yerinde %dsn% yazarak başvururuz. Parametreler, '%wwwDir%/images' gibi karakter dizileri içinde de kullanılabilir.

Parametreler yalnızca karakter dizileri veya sayılar olmak zorunda değildir, diziler 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.

Kodunuzda, örneğin bir sınıfta, herhangi bir parametrenin değerini öğrenmeniz gerekiyorsa, onu bu sınıfa aktarın. Örneğin kurucuda. Parametre değerleri için sınıfların sorgulayacağı, yapılandırmayı temsil eden global bir nesne yoktur. Bu, bağımlılık enjeksiyonu ilkesinin ihlali olurdu.

Servisler

Bkz. ayrı bölüm.

Dekoratör (Decorator)

Belirli bir tipteki tüm servisleri toplu olarak nasıl düzenlersiniz? Örneğin, belirli bir ortak atadan kalıtım alan tüm presenter'larda belirli bir metodu çağırmak? İşte bunun için dekoratör var.

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

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

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

DI

DI konteynerinin teknik ayarları.

di:
	# DIC'yi Tracy Bar'da göster?
	debugger: ...        # (bool) varsayılan true'dur

	# asla otomatik bağlanmayacak parametre tipleri
	excluded: ...        # (string[])

	# servislerin tembel oluşturulmasına izin ver?
	lazy: ...            # (bool) varsayılan false'dur

	# DI konteynerinin kalıtım aldığı sınıf
	parentClass: ...     # (string) varsayılan Nette\DI\Container'dır

Tembel Servisler

lazy: true ayarı, servislerin tembel (ertelenmiş) oluşturulmasını etkinleştirir. Bu, servislerin DI konteynerinden talep edildiği anda değil, ilk kullanıldıkları anda gerçekten oluşturulduğu anlamına gelir. Bu, uygulamanın başlangıcını hızlandırabilir ve bellek gereksinimlerini azaltabilir, çünkü yalnızca ilgili istekte gerçekten ihtiyaç duyulan servisler oluşturulur.

Belirli bir servis için tembel oluşturma değiştirilebilir.

Tembel nesneler yalnızca kullanıcı sınıfları için kullanılabilir, dahili PHP sınıfları için kullanılamaz. PHP 8.4 veya daha yenisini gerektirir.

Meta Veri Dışa Aktarma

DI konteyner sınıfı ayrıca birçok meta veri içerir. Meta veri dışa aktarımını azaltarak onu küçültebilirsiniz.

di:
	export:
		# parametreleri dışa aktar?
		parameters: false   # (bool) varsayılan true'dur

		# etiketleri ve hangilerini dışa aktar?
		tags:               # (string[]|bool) varsayılan hepsi
			- event.subscriber

		# otomatik bağlama için verileri ve hangilerini dışa aktar?
		types:              # (string[]|bool) varsayılan hepsi
			- Nette\Database\Connection
			- Symfony\Component\Console\Application

Eğer $container->getParameters() dizisini kullanmıyorsanız, parametre dışa aktarımını kapatabilirsiniz. Ayrıca, yalnızca $container->findByTag(...) metoduyla servis aldığınız etiketleri dışa aktarabilirsiniz. Eğer metodu hiç çağırmıyorsanız, etiket dışa aktarımını false ile tamamen kapatabilirsiniz.

$container->getByType() metodunun parametresi olarak kullandığınız sınıfları belirterek otomatik bağlama için meta veriyi önemli ölçüde azaltabilirsiniz. Ve yine, eğer metodu hiç çağırmıyorsanız (veya yalnızca Nette\Application\Application almak için bootstrap içinde çağırıyorsanız), dışa aktarımı false ile tamamen kapatabilirsiniz.

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 onu dibi bölümünde yapılandırırız:

dibi:
	host: localhost

Parametreleri olan bir sınıf da uzantı olarak eklenebilir:

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

Dosya Dahil Etme

Diğer yapılandırma dosyalarını includes bölümüne ekleyebiliriz:

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

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

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

Yapılandırma dosyalarında aynı anahtarlara sahip öğeler görünürse, üzerine yazılır veya diziler durumunda birleştirilir. Daha sonra dahil edilen dosya, öncekinden daha yüksek önceliğe sahiptir. includes bölümünün belirtildiği dosya, içine dahil edilen dosyalardan daha yüksek önceliğe sahiptir.

Servislerin DI konteynerine otomatik olarak eklenmesi işi son derece keyifli hale getirir. Nette, presenter'ları otomatik olarak konteynere ekler, ancak diğer herhangi bir sınıfı da kolayca eklemek mümkündür.

Sadece hangi dizinlerde (ve alt dizinlerde) sınıfları araması gerektiğini belirtmek 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

Veya belirtilen sınıflardan en az birini kalıtım alan veya uygulayan sınıfları seçebiliriz:

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

Ayrıca dışlama kuralları da tanımlanabilir, yani sınıf adı maskeleri veya kalıtımsal atalar, eğer uyuyorsa servis DI konteynerine eklenmez:

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

Tüm servislere etiketler atanabilir:

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

Birleştirme

Birden fazla yapılandırma dosyasında aynı anahtarlara sahip öğeler görünürse, üzerine yazılır veya diziler durumunda birleştirilir. Daha sonra dahil edilen dosya, öncekinden daha yüksek önceliğe sahiptir.

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

Dizilerde, anahtar adından sonra ünlem işareti belirterek birleştirmeyi önleyebilirsiniz:

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