Bootstrap
A Bootstrap egy indító kód, amely inicializálja a környezetet, létrehoz egy függőségi injektálási (DI) konténert, és elindítja az alkalmazást. Megbeszéljük:
- hogyan konfigurálhatja az alkalmazást NEON fájlok segítségével.
- hogyan kezelje a termelési és a fejlesztési módokat
- hogyan hozzuk létre a DI konténert
Az alkalmazások, akár webes alapúak, akár parancssori szkriptek, valamilyen környezet-inicializálással kezdődnek.
A régi időkben ez egy pl. include.inc.php
nevű fájl lehetett, amely ezért volt felelős, és a kezdeti fájlban
szerepelt. A modern Nette alkalmazásokban ezt felváltotta a Bootstrap
osztály, amely az alkalmazás részeként a
app/Bootstrap.php
. Ez például így nézhet ki:
index.php
A webes alkalmazások esetében az elsődleges fájl a index.php
, amely a www/
nyilvános könyvtárban található. Ez a Bootstrap osztállyal
inicializálja a környezetet, és létrehoz egy DI konténert. Ezután megkapja belőle a Application
szolgáltatást, amely elindítja a webalkalmazást:
Mint látható, a Nette\Bootstrap\Configurator osztály, amelyet most részletesebben bemutatunk, segít a környezet beállításában és a függőségi injektálás (DI) konténer létrehozásában.
Fejlesztői vs. termelési üzemmód
A Nette másképp viselkedik attól függően, hogy fejlesztési vagy termelési szerveren fut:
- 🛠️ Fejlesztési mód
- Megjeleníti a Tracy hibakereső sávot hasznos információkkal (pl. SQL-lekérdezések, végrehajtási idő, memóriahasználat).
- Hiba esetén részletes hibalevelet jelenít meg függvényhívás nyomvonalakkal és változótartalommal.
- Automatikusan frissíti a gyorsítótárat, amikor a Latte sablonok, konfigurációs fájlok stb. módosulnak.
- 🚀 Termelési mód
- Nem jelenít meg semmilyen hibakeresési információt; minden hiba naplózásra kerül.
- Hiba esetén megjelenít egy
ErrorPresenter
vagy egy általános „Szerverhiba“ oldalt. - A gyorsítótár soha nem frissül automatikusan!
- A sebességre és a biztonságra optimalizált.
Az üzemmódot automatikusan határozza meg, így a legtöbb esetben nincs szükség a manuális beállításra vagy váltásra:
- Fejlesztési üzemmód:
127.0.0.1
vagy::1
), kivéve, ha proxy van használatban (azaz a HTTP fejlécek alapján). - Gyártási üzemmód: Mindenhol máshol aktív.
Ha más esetekben, például egy adott IP-címről hozzáférő programozók számára szeretné engedélyezni a fejlesztési
üzemmódot, akkor a setDebugMode()
címet használhatja:
Mindenképpen javasoljuk az IP-cím és a cookie kombinálását. A nette-debug
cookie-ban tárolunk egy titkos
tokent, pl. secret1234
, és a fejlesztési mód az IP és a cookie ilyen kombinációjával rendelkező programozók
számára aktiválódik.
A fejlesztői módot teljesen ki is kapcsolhatjuk, akár a localhost esetében is:
A true
érték keményen bekapcsolja a fejlesztői módot, ami soha nem történhet meg egy termelő
szerveren.
Hibakereső eszköz Tracy
Az egyszerű hibakeresés érdekében bekapcsoljuk a Tracy nevű nagyszerű eszközt. Fejlesztői módban megjeleníti a hibákat, termelési módban pedig a megadott könyvtárba naplózza a hibákat:
Ideiglenes fájlok
A Nette a DI konténer, a RobotLoader, a sablonok stb. számára használja a gyorsítótárat. Ezért szükséges annak a könyvtárnak az elérési útvonalát beállítani, ahol a gyorsítótár tárolásra kerül:
Linuxon vagy macOS-en állítsa be a log/
és a temp/
könyvtárak írási engedélyeit.
RobotLoader
Általában a RobotLoader segítségével szeretnénk automatikusan betölteni az osztályokat,
ezért el kell indítanunk, és hagynunk kell, hogy betöltse az osztályokat abból a könyvtárból, ahol a
Bootstrap.php
található (azaz __DIR__
) és annak összes alkönyvtárából:
Egy alternatív megoldás az, hogy csak a Composer PSR-4 automatikus betöltését használjuk.
Időzóna
A Configurator lehetővé teszi, hogy megadjon egy időzónát az alkalmazásához.
DI konténer konfigurálása
Az indítási folyamat része a DI konténer, azaz az objektumgyár létrehozása, amely az egész alkalmazás szíve. Ez tulajdonképpen egy Nette által generált és egy cache könyvtárban tárolt PHP osztály. A gyár létrehozza az alkalmazás kulcsfontosságú objektumait, a konfigurációs fájlok pedig utasítják, hogyan hozza létre és konfigurálja őket, és így befolyásoljuk az egész alkalmazás viselkedését.
A konfigurációs fájlokat általában NEON formátumban írjuk. Itt olvashatja el, hogy mit lehet konfigurálni.
Fejlesztői üzemmódban a konténer automatikusan frissül minden alkalommal, amikor megváltoztatja a kódot vagy a konfigurációs fájlokat. Termelési módban csak egyszer generálódik, és a teljesítmény maximalizálása érdekében a fájlváltozásokat nem ellenőrzi a rendszer.
A konfigurációs fájlok betöltése a addConfig()
segítségével történik:
A addConfig()
metódus többször is meghívható több fájl hozzáadásához.
A cli.php
név nem elírás, a konfiguráció egy PHP fájlba is írható, amely tömbként adja vissza.
Alternatívaként használhatjuk a includes
szekciót is, hogy több konfigurációs fájlt töltsünk be.
Ha a konfigurációs fájlokban azonos kulcsú elemek jelennek meg, akkor azok felülíródnak, vagy tömbök esetén összevonásra kerülnek. A később bevont fájlnak magasabb
prioritása van, mint az előzőnek. Az a fájl, amelyben a includes
szakasz szerepel, magasabb prioritással
rendelkezik, mint a benne foglalt fájlok.
Statikus paraméterek
A konfigurációs fájlokban használt paramétereket a parameters
szakaszban lehet definiálni, és a
addStaticParameters()
metódus (amelynek alias neve addParameters()
) is átadhatja (vagy
felülírhatja). Fontos, hogy a különböző paraméterértékek további DI-konténerek, azaz további osztályok generálását
okozzák.
A konfigurációs fájlokban a %projectId%
szokásos jelölést írhatjuk a projectId
nevű
paraméter eléréséhez.
Dinamikus paraméterek
A konténerhez dinamikus paramétereket is hozzáadhatunk, ezek eltérő értékei a statikus paraméterekkel ellentétben nem okoznak új DI-konténerek generálását.
A környezeti változókat könnyen elérhetővé tehetnénk dinamikus paraméterek segítségével. A konfigurációs
fájlokban a %env.variable%
címen keresztül érhetjük el őket.
Alapértelmezett paraméterek
A konfigurációs fájlokban a következő statikus paramétereket használhatja:
%appDir%
aBootstrap.php
fájl könyvtárának abszolút elérési útja.%wwwDir%
aindex.php
beviteli fájlt tartalmazó könyvtár abszolút elérési útja.%tempDir%
az ideiglenes fájlok könyvtárának abszolút elérési útja.%vendorDir%
az abszolút elérési út a könyvtárak Composer általi telepítésének könyvtárához.%rootDir%
a projekt gyökérkönyvtárának abszolút elérési útvonala.%debugMode%
jelzi, hogy az alkalmazás hibakeresési módban van-e.%consoleMode%
jelzi, hogy a kérés a parancssoron keresztül érkezett-e.
Importált szolgáltatások
Most mélyebbre megyünk. Bár a DI konténer célja az objektumok létrehozása, kivételesen szükség lehet arra, hogy egy
meglévő objektumot beillesszünk a konténerbe. Ezt úgy tesszük meg, hogy a szolgáltatást a imported: true
attribútummal definiáljuk.
Hozzunk létre egy új példányt, és illesszük be a bootstrapbe:
Különböző környezetek
Ne habozzon, ha a Bootstrap
osztályt saját igényei szerint alakíthatja. A bootWebApplication()
metódushoz paramétereket adhat hozzá a webes projektek megkülönböztetése érdekében. Alternatívaként más metódusokat
is hozzáadhat, például a bootTestEnvironment()
a környezet inicializálásához a unit tesztekhez, a
bootConsoleApplication()
a parancssorból hívott szkriptekhez stb.