Nette Documentation Preview

syntax
Jak załadować plik konfiguracyjny
*********************************

.[perex]
Poszczególne składniki Nette konfigurujemy za pomocą plików konfiguracyjnych. Pokażemy, jak załadować te pliki.

.[tip]
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 |application:bootstrap#DI-Container-Configuration].
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 |neon:format] i najlepiej edytować je w [edytorach, które go obsługują |best-practices:editors-and-tools#IDE-Editor]. 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 |dependency-injection:].

Wczytywaniem konfiguracji i tworzeniem kontenera zajmuje się klasa [api:Nette\Bootstrap\Configurator], więc najpierw zainstalujemy jej pakiet `nette/bootstrap`:

```shell
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:

```php
$configurator = new Nette\Bootstrap\Configurator;
$configurator->setTempDirectory(__DIR__ . '/temp');
```

W systemie Linux lub macOS ustaw katalog `temp/` na uprawnienia do [zapisu |nette:troubleshooting#Setting-Directory-Permissions].

I dochodzimy do samych plików konfiguracyjnych. Można je załadować za pomocą strony `addConfig()`:

```php
$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 |dependency-injection:configuration#merging] w przypadku tablic). Późniejszy plik ma wyższy priorytet niż poprzedni.

Ostatnim krokiem jest stworzenie kontenera DI:

```php
$container = $configurator->createContainer();
```

I stworzy pożądane obiekty. Na przykład, jeśli używasz konfiguracji dla [Nette Database |database:configuration], możesz poprosić ją o utworzenie połączeń z bazą danych:

```php
$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 .[#toc-vyvojarsky-vs-produkcni-rezim]
---------------------------------------------------------------------

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()`:

```php
$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:

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

Możemy też całkowicie wyłączyć tryb deweloperski, nawet dla localhost:

```php
$configurator->setDebugMode(false);
```


Parametry .[#toc-parametry]
---------------------------

Można również używać parametrów w plikach konfiguracyjnych, które są zdefiniowane [w sekcji `parameters` |dependency-injection:configuration#parameters].

Mogą być również zakładane zewnętrznie metodą `addDynamicParameters()`:

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

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


{{leftbar: nette:@menu-topics}}

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%.