Jak wczytać plik konfiguracyjny

Poszczególne części Nette ustawiamy za pomocą plików konfiguracyjnych. Pokażemy, jak te pliki wczytywać.

Jeśli używasz całego frameworka, nie trzeba nic więcej robić. W projekcie masz przygotowany katalog config/ na pliki konfiguracyjne, a ich wczytywaniem zajmuje się bootloader aplikacji. Ten artykuł jest dla użytkowników, którzy używają tylko jednej biblioteki Nette i chcą wykorzystać możliwości plików konfiguracyjnych.

Pliki konfiguracyjne zazwyczaj zapisuje się w formacie NEON i najlepiej edytuje się je w edytorach z jego obsługą. Można je rozumieć jako instrukcje, jak tworzyć i konfigurować obiekty. Zatem wynikiem wczytania konfiguracji będzie tzw. fabryka, czyli obiekt, który na żądanie utworzy nam kolejne obiekty, których chcemy używać. Na przykład połączenie z bazą danych itp.

Ta fabryka nazywana jest również kontenerem dependency injection (kontenerem DI), a jeśli interesują Cię szczegóły, przeczytaj rozdział o dependency injection.

Wczytanie konfiguracji i utworzenie kontenera zapewnia klasa Nette\Bootstrap\Configurator, więc najpierw zainstalujemy jej pakiet nette/bootstrap:

composer require nette/bootstrap

I tworzymy 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');

Na Linuksie lub macOS ustaw katalogowi temp/ uprawnienia do zapisu.

Dochodzimy do samych plików konfiguracyjnych. Wczytujemy je za pomocą 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 w przypadku tablic scalane). Później wczytany plik ma wyższy priorytet niż poprzedni.

Ostatnim krokiem jest utworzenie kontenera DI:

$container = $configurator->createContainer();

A ten już utworzy nam żądane obiekty. Jeśli na przykład używasz konfiguracji dla Nette Database, możesz go poprosić 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');

I teraz możesz już pracować z bazą danych!

Tryb deweloperski vs produkcyjny

W trybie deweloperskim kontener jest automatycznie aktualizowany przy każdej zmianie plików konfiguracyjnych. W trybie produkcyjnym generowany jest tylko raz, a zmiany nie są sprawdzane. Tryb deweloperski jest więc ukierunkowany na maksymalny komfort programisty, tryb produkcyjny na wydajność i wdrożenie produkcyjne.

Wybór trybu odbywa się poprzez autodetekcję, więc zazwyczaj nie ma potrzeby niczego konfigurować ani ręcznie przełączać. Tryb jest deweloperski, jeśli aplikacja jest uruchomiona na localhost (tj. adres IP 127.0.0.1 lub ::1) i nie ma obecnego proxy (tj. jego nagłówka HTTP). W przeciwnym razie działa w trybie produkcyjnym.

Jeśli chcemy włączyć tryb deweloperski również w innych przypadkach, na przykład dla programistów łączących się z określonego adresu IP, używamy setDebugMode():

$configurator->setDebugMode('23.75.345.200');
// można również podać tablicę adresów IP

Zdecydowanie zalecamy łączenie adresu IP z ciasteczkiem. W ciasteczku nette-debug zapiszemy tajny token, np. secret1234, i w ten sposób aktywujemy tryb deweloperski dla programistów łączących się z określonego adresu IP i jednocześnie posiadających w ciasteczku wspomniany token:

$configurator->setDebugMode('secret1234@23.75.345.200');

Tryb deweloperski możemy również całkowicie wyłączyć, nawet dla localhost:

$configurator->setDebugMode(false);

Parametry

W plikach konfiguracyjnych możesz również używać parametrów, które są definiowane w sekcji parameters.

Można je również wstawiać z zewnątrz za pomocą metody addDynamicParameters():

$configurator->addDynamicParameters([
	'remoteIp' => $_SERVER['REMOTE_ADDR'],
]);

Do parametru projectId można się odwołać w konfiguracji zapisem %projectId%.

wersja: 3.x