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\UI\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.
Szukaj
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 |
---|---|---|
|
|
|
W przypadku pól można zapobiec scalaniu, umieszczając wykrzyknik po nazwie klucza:
config1.neon | config2.neon | Wynik |
---|---|---|
|
|
|