Nette Bootstrap
Poszczególne komponenty Nette konfiguruje się za pomocą plików konfiguracyjnych. Pokażemy, jak te pliki wczytać.
Jeśli używasz całego frameworku, nie musisz robić nic więcej. Twój projekt ma przygotowany katalog
config/ na pliki konfiguracyjne, a ich wczytywaniem zajmuje się loader aplikacji. Ten artykuł jest
dla użytkowników używających tylko jednej biblioteki Nette, którzy chcą skorzystać z plików konfiguracyjnych.
Pliki konfiguracyjne pisze się zwykle w formacie NEON, a najlepiej edytuje w edytorach, które go wspierają. Można myśleć o nich jak o instrukcjach, jak tworzyć i konfigurować obiekty. Wynikiem wczytania konfiguracji będzie więc tak zwana fabryka, czyli obiekt tworzący na żądanie inne obiekty, których chcesz używać. Na przykład połączenie z bazą danych itd.
Fabrykę tę nazywa się też kontenerem dependency injection (kontenerem DI), a jeśli interesują Cię szczegóły, przeczytaj rozdział o dependency injection.
Wczytaniem konfiguracji i utworzeniem kontenera zajmuje się klasa Nette\Bootstrap\Configurator, więc najpierw
zainstalujemy jej pakiet nette/bootstrap:
composer require nette/bootstrap
I utworzymy instancję klasy Configurator. Ponieważ wygenerowany kontener DI będzie buforowany na dysku, musisz
ustawić ścieżkę do katalogu, w którym zostanie zapisany:
$configurator = new Nette\Bootstrap\Configurator;
$configurator->setTempDirectory(__DIR__ . '/temp');
W Linuksie albo macOS ustaw katalogowi temp/ uprawnienia do zapisu.
Teraz przechodzimy do samych plików konfiguracyjnych. Wczytujemy je za pomocą addConfig():
$configurator->addConfig(__DIR__ . '/database.neon');
Jeśli chcesz dodać więcej plików konfiguracyjnych, możesz wywołać funkcję addConfig() wielokrotnie. Jeśli
w plikach pojawią się elementy o tych samych kluczach, zostaną nadpisane (albo scalone w przypadku tablic). Plik dodany
później ma wyższy priorytet niż poprzedni.
Ostatnim krokiem jest utworzenie kontenera DI:
$container = $configurator->createContainer();
I to utworzy nam pożądane obiekty. Jeśli na przykład używasz konfiguracji dla Nette Database, możesz poprosić go o utworzenie połączeń z bazą danych:
$db = $container->getByType(Nette\Database\Connection::class);
// albo
$explorer = $container->getByType(Nette\Database\Explorer::class);
// albo przy tworzeniu wielu połączeń
$db = $container->getByName('database.main.connection');
I teraz możesz pracować z bazą danych!
Tryb deweloperski a produkcyjny
W trybie deweloperskim kontener aktualizowany jest automatycznie zawsze, gdy zmienią się pliki konfiguracyjne. W trybie produkcyjnym generowany jest tylko raz, a zmiany nie są sprawdzane. Tryb deweloperski nastawiony jest więc na maksymalną wygodę programisty, a tryb produkcyjny skupia się na wydajności i wdrożeniu produkcyjnym.
Wybór trybu odbywa się przez autodetekcję, więc zwykle nie trzeba niczego konfigurować ani ręcznie przełączać. Tryb
jest deweloperski, jeśli aplikacja działa na localhoście (czyli pod adresem IP 127.0.0.1 albo ::1)
i nie ma proxy (czyli jego nagłówka HTTP). W przeciwnym razie działa w trybie produkcyjnym.
Jeśli chcemy włączyć tryb deweloperski także w innych przypadkach, na przykład dla programistów łączących się
z konkretnego adresu IP, użyj setDebugMode():
$configurator->setDebugMode('23.75.345.200');
// można podać też tablicę adresów IP
Zdecydowanie zalecamy łączenie adresu IP z cookie. Zapisz do cookie nette-debug tajny token, np.
secret1234. W ten sposób włączysz tryb deweloperski dla programistów łączących się z konkretnego adresu IP,
którzy mają w cookie wspomniany token:
$configurator->setDebugMode('secret1234@23.75.345.200');
Tryb deweloperski możemy też całkowicie wyłączyć, nawet dla localhosta:
$configurator->setDebugMode(false);
Parametry
W plikach konfiguracyjnych możesz też używać parametrów definiowanych w sekcji parameters.
Można je też wstawić z zewnątrz metodą addDynamicParameters():
$configurator->addDynamicParameters([
'remoteIp' => $_SERVER['REMOTE_ADDR'],
]);
Do parametru remoteIp można odwołać się w konfiguracji zapisem %remoteIp%.
Jeśli aktualizujesz do nowszej wersji, zajrzyj na stronę aktualizacji.