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.
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:
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.
Dekorator może być również użyty do ustawienia tagów lub włączenia trybu iniekcji.
DI
Ustawienia techniczne kontenera DI.
Lazy Services
Ustawienie lazy: true
umożliwia leniwe (odroczone) tworzenie usług. Oznacza to, że usługi nie są faktycznie
tworzone, gdy są wymagane z kontenera DI, ale tylko przy ich pierwszym użyciu. Może to przyspieszyć uruchamianie aplikacji
i zmniejszyć zużycie pamięci, ponieważ tworzone są tylko usługi wymagane dla konkretnego żądania.
Dla konkretnej usługi można dostosować leniwe tworzenie.
Leniwe obiekty mogą być używane tylko dla klas zdefiniowanych przez użytkownika, a nie dla wewnętrznych klas PHP. Wymaga PHP 8.4 lub nowszego.
Eksport metadanych
Klasa kontenera DI zawiera również wiele metadanych. Możesz go zmniejszyć, zmniejszając eksport metadanych.
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
Następnie konfigurujemy go w sekcji dibi
:
Jako rozszerzenie możesz również dodać klasę, która ma parametry:
Wstawianie plików
Dodatkowe pliki konfiguracyjne można przesłać w sekcji includes
:
Nazwa parameters.php
nie jest literówką, konfiguracja może być również zapisana w pliku PHP, który zwraca
ją jako tablicę:
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:
Zazwyczaj nie chcemy dodawać wszystkich klas i interfejsów, więc możemy je filtrować:
Możemy też wybrać klasy, które dziedziczą lub implementują przynajmniej jedną z wymienionych klas:
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:
Wszystkie usługi mogą być oznakowane:
Łą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 |
---|---|---|