Cum să încărcați un fișier de configurare
Componentele individuale Nette sunt configurate folosind fișiere de configurare. Vom arăta cum să încărcați aceste fișiere.
Dacă utilizați întregul framework, nu este nevoie să faceți nimic altceva. În proiect aveți un director
config/
pregătit pentru fișierele de configurare, iar încărcarea lor este gestionată de încărcătorul aplicației. Acest articol
este pentru utilizatorii care folosesc doar o singură bibliotecă Nette și doresc să profite de posibilitățile fișierelor
de configurare.
Fișierele de configurare sunt de obicei scrise în formatul NEON și cel mai bine se editează în editori cu suport pentru acesta. Ele pot fi înțelese ca instrucțiuni despre cum să creați și configurați obiecte. Prin urmare, rezultatul încărcării configurației va fi așa-numita fabrică (factory), care este un obiect ce ne va crea la cerere alte obiecte pe care dorim să le folosim. De exemplu, conexiuni la baze de date etc.
Această fabrică se mai numește și dependency injection container (container DI) și, dacă sunteți interesat de detalii, citiți capitolul despre dependency injection.
Încărcarea configurației și crearea containerului sunt gestionate de clasa Nette\Bootstrap\Configurator, așa că mai
întâi vom instala pachetul său nette/bootstrap
:
composer require nette/bootstrap
Și vom crea o instanță a clasei Configurator
. Deoarece containerul DI generat va fi stocat în cache pe disc,
este necesar să setați calea către directorul unde va fi salvat:
$configurator = new Nette\Bootstrap\Configurator;
$configurator->setTempDirectory(__DIR__ . '/temp');
Pe Linux sau macOS, setați drepturi de
scriere pentru directorul temp/
.
Și ajungem la fișierele de configurare în sine. Le încărcăm folosind addConfig()
:
$configurator->addConfig(__DIR__ . '/database.neon');
Dacă dorim să adăugăm mai multe fișiere de configurare, putem apela funcția addConfig()
de mai multe ori.
Dacă în fișiere apar elemente cu aceleași chei, acestea vor fi suprascrise (sau, în cazul array-urilor, combinate). Fișierul încărcat ulterior are
prioritate mai mare decât cel anterior.
Ultimul pas este crearea containerului DI:
$container = $configurator->createContainer();
Și acesta ne va crea obiectele solicitate. De exemplu, dacă utilizați configurația pentru Nette Database, îi puteți cere să creeze conexiuni la baza de date:
$db = $container->getByType(Nette\Database\Connection::class);
// sau
$explorer = $container->getByType(Nette\Database\Explorer::class);
// sau la crearea mai multor conexiuni
$db = $container->getByName('database.main.connection');
Și acum puteți lucra cu baza de date!
Mod dezvoltator vs mod producție
În modul dezvoltator, containerul se actualizează automat la fiecare modificare a fișierelor de configurare. În modul producție, se generează o singură dată și modificările nu sunt verificate. Modul dezvoltator este, prin urmare, axat pe confortul maxim al programatorului, iar modul producție pe performanță și implementare live.
Selectarea modului se face prin autodetecție, deci de obicei nu este nevoie să configurați sau să comutați manual nimic.
Modul este dezvoltator dacă aplicația este rulată pe localhost (adică adresa IP 127.0.0.1
sau ::1
)
și nu este prezent un proxy (adică antetul său HTTP). Altfel, rulează în modul producție.
Dacă dorim să activăm modul dezvoltator și în alte cazuri, de exemplu pentru programatorii care accesează de la
o anumită adresă IP, folosim setDebugMode()
:
$configurator->setDebugMode('23.75.345.200');
// se poate specifica și un array de adrese IP
Recomandăm cu tărie combinarea adresei IP cu un cookie. Vom stoca un token secret în cookie-ul nette-debug
, de
exemplu secret1234
, și astfel vom activa modul dezvoltator pentru programatorii care accesează de la o anumită
adresă IP și au în același timp tokenul menționat în cookie:
$configurator->setDebugMode('secret1234@23.75.345.200');
Putem, de asemenea, să dezactivăm complet modul dezvoltator, chiar și pentru localhost:
$configurator->setDebugMode(false);
Parametri
În fișierele de configurare puteți utiliza și parametri, care sunt definiți în secțiunea parameters
.
Aceștia pot fi, de asemenea, inserați din exterior folosind metoda addDynamicParameters()
:
$configurator->addDynamicParameters([
'remoteIp' => $_SERVER['REMOTE_ADDR'],
]);
Parametrul projectId
poate fi referențiat în configurație prin notația %projectId%
.