Jak załadować plik konfiguracyjny
Poszczególne składniki Nette konfigurujemy za pomocą plików konfiguracyjnych. Pokażemy, jak załadować te pliki.
Jeśli używasz całego frameworka, nie ma potrzeby robić nic więcej. Projekt posiada wstępnie zbudowany katalog
dla plików konfiguracyjnych, config/
, a za ich załadowanie odpowiada program ładujący aplikacje. Ten artykuł
jest przeznaczony dla użytkowników, którzy używają tylko jednej biblioteki Nette i chcą skorzystać z plików
konfiguracyjnych.
Pliki konfiguracyjne są zazwyczaj zapisane w formacie NEON i najlepiej edytować je w edytorach, które go obsługują. Można o nich myśleć jako o instrukcjach, jak tworzyć i konfigurować obiekty. Tak więc wynikiem załadowania konfiguracji będzie tzw. fabryka, czyli obiekt, który na żądanie będzie tworzył inne obiekty, których chcemy użyć. Na przykład połączenie z bazą danych itp.
Fabrykę tę nazywa się również kontenerem wstrzykiwania zależności (kontenerem DI), a jeśli interesują Cię szczegóły, przeczytaj rozdział o wstrzykiwaniu zależności.
Wczytywaniem konfiguracji i tworzeniem kontenera zajmuje się klasa Nette\Bootstrap\Configurator, więc najpierw
zainstalujemy jej pakiet nette/bootstrap
:
composer require nette/bootstrap
I utwórz instancję klasy Configurator
Ponieważ wygenerowany kontener DI będzie buforowany na dysku, konieczne
jest ustawienie ścieżki do katalogu, w którym będzie przechowywany:
$configurator = new Nette\Bootstrap\Configurator;
$configurator->setTempDirectory(__DIR__ . '/temp');
W systemie Linux lub macOS ustaw katalog temp/
na uprawnienia do zapisu.
I dochodzimy do samych plików konfiguracyjnych. Można je załadować za pomocą strony addConfig()
:
$configurator->addConfig(__DIR__ . '/database.neon');
Jeśli chcemy dodać więcej plików konfiguracyjnych, możemy wywołać funkcję addConfig()
wielokrotnie. Jeśli
w plikach pojawią się elementy o tych samych kluczach, zostaną one nadpisane (lub scalone w przypadku tablic). Późniejszy plik ma wyższy priorytet
niż poprzedni.
Ostatnim krokiem jest stworzenie kontenera DI:
$container = $configurator->createContainer();
I stworzy pożądane obiekty. Na przykład, jeśli używasz konfiguracji dla Nette Database, możesz poprosić ją o utworzenie połączeń z bazą danych:
$db = $container->getByType(Nette\Database\Connection::class);
// lub
$explorer = $container->getByType(Nette\Database\Explorer::class);
// lub przy tworzeniu wielu połączeń
$db = $container->getByName('database.main.connection');
A teraz możesz pracować z bazą danych!
Tryb deweloperski a produkcyjny
W trybie deweloperskim kontener jest automatycznie aktualizowany przy każdej zmianie plików konfiguracyjnych. W trybie produkcyjnym jest on generowany tylko raz, a zmiany nie są sprawdzane. Tak więc tryb deweloperski ma na celu maksymalną wygodę programisty, tryb produkcyjny ma na celu wydajność i ostre wdrożenie.
Wybór trybu odbywa się poprzez autodetekcję, więc zazwyczaj nie ma potrzeby konfigurowania czy ręcznego przełączania
czegokolwiek. Tryb jest rozwijany, gdy aplikacja jest uruchomiona na localhost (czyli na adresie IP 127.0.0.1
lub
::1
) i nie jest obecne żadne proxy (czyli jego nagłówek HTTP). W przeciwnym razie działa w trybie
produkcyjnym.
Jeśli chcemy włączyć tryb deweloperski w innych przypadkach, takich jak programiści uzyskujący dostęp z określonego
adresu IP, używamy setDebugMode()
:
$configurator->setDebugMode('23.75.345.200');
// można również określić pole adresu IP
Zdecydowanie zalecamy połączenie adresu IP z plikiem cookie. W pliku cookie nette-debug
przechowujemy tajny
token, np. secret1234
, i w ten sposób umożliwiamy tryb deweloperski dla programistów uzyskujących dostęp
z określonego adresu IP i posiadających token w pliku cookie:
$configurator->setDebugMode('secret1234@23.75.345.200');
Możemy też całkowicie wyłączyć tryb deweloperski, nawet dla localhost:
$configurator->setDebugMode(false);
Parametry
Można również używać parametrów w plikach konfiguracyjnych, które są zdefiniowane w sekcji parameters
.
Mogą być również zakładane zewnętrznie metodą addDynamicParameters()
:
$configurator->addDynamicParameters([
'remoteIp' => $_SERVER['REMOTE_ADDR'],
]);
Do parametru projectId
można się odwołać w konfiguracji poprzez wpisanie %projectId%
.