Definiowanie usług
Konfiguracja to miejsce, w którym instruujemy kontener DI, jak składać poszczególne usługi i jak łączyć je z innymi zależnościami. Nette zapewnia bardzo przejrzysty i elegancki sposób na osiągnięcie tego celu.
Sekcja services
w pliku konfiguracyjnym NEON to miejsce, w którym definiujemy nasze niestandardowe usługi i ich
konfiguracje. Przyjrzyjmy się prostemu przykładowi definiowania usługi o nazwie database
, która reprezentuje
instancję klasy PDO
:
Ta konfiguracja skutkuje następującą metodą fabryczną w kontenerze DI:
Nazwy usług pozwalają nam odwoływać się do nich w innych częściach pliku konfiguracyjnego, używając formatu
@serviceName
. Jeśli nie ma potrzeby nazywania usługi, możemy po prostu użyć punktora:
Aby pobrać usługę z kontenera DI, możemy użyć metody getService()
z nazwą usługi jako parametrem lub
metody getByType()
z typem usługi:
Tworzenie usług
Najczęściej tworzymy usługę po prostu poprzez instancjonowanie określonej klasy. Na przykład:
Jeśli musimy rozszerzyć konfigurację o dodatkowe klucze, definicję można rozszerzyć na wiele linii:
Klucz create
ma alias factory
, obie wersje są powszechne w praktyce. Zalecamy jednak używanie
create
.
Argumenty konstruktora lub metoda tworzenia mogą być alternatywnie zapisane w kluczu arguments
:
Usługi nie muszą być tworzone tylko przez prostą instancję klasy; mogą one również wynikać z wywoływania metod statycznych lub metod innych usług:
Zauważ, że dla uproszczenia, zamiast ->
, używamy ::
, patrz wyrażenie oznacza. Te metody fabryczne są generowane:
Kontener DI musi znać typ tworzonej usługi. Jeśli tworzymy usługę przy użyciu metody, która nie ma określonego typu zwracanego, musimy wyraźnie wspomnieć o tym typie w konfiguracji:
Argumenty
Przekazujemy argumenty do konstruktorów i metod w sposób bardzo podobny do zwykłego PHP:
Dla lepszej czytelności możemy wypisać argumenty w osobnych wierszach. W tym formacie użycie przecinków jest opcjonalne:
Można również nazwać argumenty, co pozwala nie martwić się o ich kolejność:
Jeśli chcesz pominąć niektóre argumenty i użyć ich wartości domyślnych lub wstawić usługę poprzez autowiring, użyj podkreślenia:
Argumentami mogą być usługi, parametry i wiele innych, patrz środki wyrazu.
Konfiguracja
W sekcji setup
definiujemy metody, które powinny być wywoływane podczas tworzenia usługi.
W PHP wyglądałoby to następująco:
Oprócz wywoływania metod, można również przekazywać wartości do właściwości. Dodawanie elementu do tablicy jest również obsługiwane, ale należy je ująć w cudzysłów, aby uniknąć kolizji ze składnią NEON:
W PHP tłumaczyłoby się to na:
W konfiguracji można również wywoływać metody statyczne lub metody innych usług. Jeśli chcesz przekazać bieżącą
usługę jako argument, użyj @self
:
Zauważ, że dla uproszczenia, zamiast ->
, używamy ::
, patrz środki wyrazu. Spowoduje to wygenerowanie następującej metody fabrycznej:
Środki wyrazu
Nette DI zapewnia nam wyjątkowo bogate możliwości wyrażania, pozwalając nam wyrazić prawie wszystko. W plikach konfiguracyjnych możemy używać parametrów:
Możemy również tworzyć obiekty, wywoływać metody i funkcje:
Odnosić się do usług poprzez ich nazwę lub typ:
Używaj składni wywoływalnej pierwszej klasy:
Użyj stałych:
Wywołania metod mogą być łańcuchowane, tak jak w PHP. Dla uproszczenia, zamiast ->
, używamy
::
:
Wyrażenia te mogą być używane w dowolnym miejscu podczas tworzenia usług, w argumentach, w sekcji konfiguracji lub w parametrach:
Funkcje specjalne
W plikach konfiguracyjnych można korzystać z tych funkcji specjalnych:
not()
dla negacji wartościbool()
,int()
,float()
,string()
do bezstratnego rzutowania typówtyped()
do generowania tablicy wszystkich usług określonego typutagged()
do tworzenia tablicy wszystkich usług z danym tagiem
W porównaniu do konwencjonalnego rzutowania typów w PHP, takiego jak (int)
, bezstratne rzutowanie typów rzuci
wyjątek dla wartości nienumerycznych.
Funkcja typed()
tworzy tablicę wszystkich usług określonego typu (klasy lub interfejsu). Wyklucza ona usługi
z wyłączonym autowiringiem. Można określić wiele typów, oddzielając je przecinkami.
Można również automatycznie przekazać tablicę usług określonego typu jako argument przy użyciu autowiring.
Funkcja tagged()
tworzy tablicę wszystkich usług z określonym tagiem. Można wymienić wiele tagów,
oddzielając je przecinkami.
Okablowanie
Klucz autowired
pozwala modyfikować zachowanie autoprzewodowania dla określonej usługi. Więcej szczegółów
można znaleźć w rozdziale autowiring.
Lazy Services
Leniwe ładowanie to technika, która opóźnia utworzenie usługi do momentu, gdy jest ona rzeczywiście potrzebna. Leniwe tworzenie usług można włączyć globalnie w konfiguracji dla wszystkich usług jednocześnie. W przypadku poszczególnych usług zachowanie to można zastąpić:
Gdy usługa jest zdefiniowana jako leniwa, żądanie jej z kontenera DI zwróci specjalny obiekt proxy. Ten obiekt proxy wygląda i zachowuje się jak rzeczywista usługa, ale prawdziwa inicjalizacja (wywołanie konstruktora i konfiguracja) nastąpi tylko przy pierwszym wywołaniu dowolnej z jego metod lub właściwości.
Leniwe ładowanie może być używane tylko dla klas zdefiniowanych przez użytkownika, a nie dla wewnętrznych klas PHP. Wymaga PHP w wersji 8.4 lub nowszej.
Tagi
Tagi służą do dodawania dodatkowych informacji do usług. Do usługi można przypisać jeden lub więcej tagów:
Tagi mogą również zawierać wartości:
Aby pobrać wszystkie usługi z określonymi tagami, można użyć funkcji tagged()
:
W kontenerze DI można uzyskać nazwy wszystkich usług z określonym tagiem za pomocą metody findByTag()
:
Tryb wstrzykiwania
Użycie flagi inject: true
aktywuje przekazywanie zależności poprzez zmienne publiczne z adnotacją inject i metodami inject*().
Domyślnie flaga inject
jest aktywowana tylko dla prezenterów.
Modyfikacje usługi
Kontener DI zawiera wiele usług dodanych przez rozszerzenia wbudowane lub użytkownika. Definicje tych usług można modyfikować bezpośrednio w konfiguracji. Na przykład
można zmienić klasę usługi application.application
, która jest konwencjonalnie
Nette\Application\Application
, na coś innego:
Flaga alteration
ma charakter informacyjny, wskazując, że jedynie modyfikujemy istniejącą usługę.
Możemy również uzupełnić konfigurację:
Podczas nadpisywania usługi może być konieczne usunięcie oryginalnych argumentów, elementów konfiguracji lub tagów, co
jest przydatne w przypadku reset
:
Jeśli chcesz usunąć usługę dodaną przez rozszerzenie, możesz to zrobić w następujący sposób: