Konfiguracja kontenera DI

Przegląd opcji konfiguracyjnych kontenera Nette DI.

Plik konfiguracyjny

Kontener Nette DI jest łatwy w użyciu dzięki plikom konfiguracyjnym. Zazwyczaj są one zapisane w formacie NEON. Do edycji zalecane są edytory z obsługą tego formatu.

 decorator: 	dekorator
di: kontener DI
extensions: zainstaluj inne rozszerzenia DI
includes: wstawianie plików
parameters: parametry
search: automatyczna rejestracja serwisu
services: serwisy

Aby wprowadzić ciąg zawierający znak %, musíte jej escapovat zdvojením na %%.

Parametry

W konfiguracji można zdefiniować parametry, które następnie mogą być wykorzystane jako część definicji usług. Może to uczynić konfigurację bardziej przejrzystą lub ujednolicić i wyizolować wartości, które będą zmieniane.

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

Do parametru dsn można się odwołać w dowolnym miejscu konfiguracji, pisząc %dsn%. Parametry mogą być również używane wewnątrz łańcuchów, np. '%wwwDir%/images'.

Parametry nie muszą być ciągami znaków lub liczbami, mogą również zawierać pola:

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

Określony klucz określamy jako %mailer.user%.

Jeśli potrzebujesz uzyskać wartość dowolnego parametru w swoim kodzie, na przykład klasy, przekaż ją do tej klasy. Na przykład w konstruktorze. Nie ma globalnego obiektu reprezentującego konfigurację, którą klasy odpytywałyby o wartości parametrów. Byłoby to naruszenie zasady wtrysku zależności.

Usługi

Patrz osobny rozdział.

Dekorator

Jak masowo edytować wszystkie usługi danego typu? Na przykład wywołaj określoną metodę na wszystkich prezenterach, które dziedziczą po określonym wspólnym przodku? Do tego właśnie służy dekorator.

decorator:
	# dla wszystkich usług, które są instancjami tej klasy lub interfejsu
	App\Presenters\BasePresenter:
		setup:
			- setProjectId(10)     # wywołaj tę metodę
			- $absoluteUrls = true # i ustawić zmienną

Dekorator może być również użyty do ustawienia tagów lub włączenia trybu iniekcji.

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

DI

Ustawienia techniczne kontenera DI.

di:
	# pokazać DIC w Tracy Bar?
	debugger: ...        # (bool) domyślnie jest true

	# typy parametrów, które nigdy nie są autowire
	excluded: ...        # (string[])

	# klasa, po której dziedziczy kontener DI
	parentClass: ...     # (string) default to Nette\DI\Container

Eksport metadanych

Klasa kontenera DI zawiera również wiele metadanych. Możesz go zmniejszyć, zmniejszając eksport metadanych.

di:
	export:
		# parametry eksportu?
		parameters: false   # (bool) domyślnie jest true

		# eksportować tagi i jakie?
		tags:               # (string[]|bool) domyślnie wszystkie
			- event.subscriber

		# eksportować dane autowiringowe i jakie?
		types:              # (string[]|bool) default to all
			- Nette\Database\Connection
			- Symfony\Component\Console\Application

Jeśli nie używasz pola $container->getParameters(), możesz wyłączyć eksport parametrów. Można również wyeksportować tylko te tagi, za pośrednictwem których uzyskuje się usługi metodą $container->findByTag(...). Jeśli w ogóle nie wywołujesz metody, możesz całkowicie wyłączyć eksport tagów za pomocą false.

Możesz znacznie zmniejszyć metadane dla autowiring, określając klasy, których używasz jako parametr metody $container->getByType(). I znowu, jeśli nie wywołujesz metody w ogóle (lub tylko w bootstrapie, aby uzyskać Nette\Application\Application), możesz całkowicie wyłączyć eksport za pomocą false.

Przedłużenie

Zarejestruj więcej rozszerzeń DI. W ten sposób dodajemy np. rozszerzenie DI Dibi\Bridges\Nette\DibiExtension22 pod nazwą dibi

extensions:
	dibi: Dibi\Bridges\Nette\DibiExtension22

Następnie konfigurujemy go w sekcji dibi:

dibi:
	host: localhost

Jako rozszerzenie możesz również dodać klasę, która ma parametry:

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

Wstawianie plików

Dodatkowe pliki konfiguracyjne można przesłać w sekcji includes:

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

Nazwa parameters.php nie jest literówką, konfiguracja może być również zapisana w pliku PHP, który zwraca ją jako tablicę:

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

Jeśli w plikach konfiguracyjnych pojawią się elementy o takich samych kluczach, zostaną one nadpisane, lub scalone w przypadku pól. Plik wstawiony później ma wyższy priorytet niż poprzedni. Plik, w którym wymieniona jest sekcja includes ma wyższy priorytet niż pliki wstawione do niego.

Automatyczne dodawanie usług do kontenera DI czyni pracę niezwykle wygodną. Nette automatycznie dodaje prezenterów do kontenera, ale możesz łatwo dodać dowolne inne klasy.

Wystarczy określić, w których katalogach (i podkatalogach) szukać klas:

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

Zazwyczaj nie chcemy dodawać wszystkich klas i interfejsów, więc możemy je filtrować:

search:
	-	in: %appDir%/Forms

		# filter by filename (string|string[])
		files:
			- *Factory.php

		# filter by class name (string|string[])
		classes:
			- *Factory

Możemy też wybrać klasy, które dziedziczą lub implementują przynajmniej jedną z wymienionych klas:

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

Można również zdefiniować reguły wykluczenia, czyli maski nazw klas lub dziedziczonych przodków, które jeśli będą pasować, usługa nie zostanie dodana do kontenera DI:

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

Wszystkie usługi mogą być oznakowane:

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

Łączenie

Jeśli elementy o tych samych kluczach pojawią się w wielu plikach konfiguracyjnych, zostaną nadpisane lub, w przypadku tablic, scalone. Plik wstawiony później ma wyższy priorytet niż poprzedni.

config1.neon config2.neon Wynik
items:
	- 1
	- 2
items:
	- 3
items:
	- 1
	- 2
	- 3

W przypadku pól można zapobiec scalaniu, umieszczając wykrzyknik po nazwie klucza:

config1.neon config2.neon Wynik
items:
	- 1
	- 2
items!:
	- 3
items:
	- 3
wersja: 3.x