Nette\Environment
Propojení s Nette\Config
Třída Config má na starosti načtení konfigurace prostředí složené
z kombinací nastaveních, služeb, proměnných a konstant. Doporučuje se
používat konfiguraci uloženou ve formátech ini a
xml, jelikož nativní parsery pro tyto soubory jsou nativně
podporovány v PHP a jsou velmi rychlé. Dokonce tak rychlé, že naparsovanou
konfiguraci se nevyplatí ani kešovat.
Příklad config.ini souboru:
[common]
set.date-timezone = "Europe/Prague"
set.iconv-internal_encoding = "%encoding%"
set.mbstring-internal_encoding = "%encoding%"
set.include_path = "%appDir%;%libsDir%"
variable.tempDir = %appDir%/cache
variable.foo = %bar% world
variable.bar = hello
const.PROJECT = eshop
[production < common]
database.driver = sqlite
database.file = "%modelsDir%/demo.db"
database.lazy = TRUE
service.Nette-Security-IAuthenticator = Users
[development < production]
database.profiler = TRUE
Následující blok kódu demonstruje, jak lze s konfiguračními soubory pracovat:
// načtení a kontrolního vypsání konfigurace
$config = Config::fromFile('config.ini');
Debug::dump((array) $config);
// současnou konfiguraci můžeme i ukládat,
// do souboru se přidá poznámka, že byl vygenerovan
$config->save('config_generated.ini', 'production');
// Config::fromFile() pouze načte nastavení ze souboru a uchová jej do objektu,
// oproti tomu Environment::loadConfig() jej načte a aplikuje
Environment::loadConfig('config.ini');
// nebo ekvivalentně:
Config::loadConfig($config);
// změny v prostředí PHP můžeme zkontrolovat
phpinfo();
if (defined('PROJECT')) echo PROJECT;
Poznámka k set.include_path: V linuxových systémech
se používá jiný oddělovač cest než na Windows systémech.
Nette\Config řeší tento problém použitím univerzálního
oddělovače cest v konfiguračním souboru (středník), pak při běhu
nahradí tento oddělovač za oddělovač cest konkrétní platformy, tudíž
nedochází k žádným nekompatibilitám.
Název prostředí
Prostředí je zjednodušeně název počítače, na kterém aplikace právě běží. Může to být jeden z počítačů, kde probíhá vývoj, může to být produkční server. Každé prostředí má jiné parametry (cesty k adresářům, připojení k databázi, …), mohu si je pojmenovat a podle názvu prostředí načíst kupříkladu konfiguraci:
Environment::setName('mujpocitac');
...
Environment::loadConfig(); // nacte z config.ini sekci [mujpocitac]
Název prostředí je libovolný řetězec, na kterém žádná logika v Nette nestojí.
Režimy prostředí
Režim neboli mód je indikátor, určující nějaký parametr daného
prostředí. Módy lze nastavovat buď přes config.ini, nebo přímo voláním
Environment::setMode('mujmod', $bool), zjišťovat stav lze přes
Environment::getMode('mujmod').
Autodetekce
Třída Nette\Environment disponuje vestavěnou autodetekcí pro režimy
live, debug, console a pro název prostředí (a jako téměř vše
v Nette ji lze rozšířit nebo přepsat). Asi nejdůležitější mód
live určuje, jestli aplikace běží na ostrém (produkčním)
serveru nebo ne. Proto také existuje zkratka, místo
Environment::getMode('live') lze volat výstižnější
Environment::isLive(). Pro režimy console a
debug existují obdobné zkratky
Environment::isConsole() a
Environment::isDebugging().
Autodetekce názvu prostředí úzce souvisí s detekcí režimů
live & console, protože právě na základě nich
se název zvolí z variant Environment::DEVELOPMENT,
Environment::PRODUCTION nebo Environment::CONSOLE.
Příklad
…a přímo ze života: mám jednu aplikaci, která běží v pěti různých prostředích:
- 2× na lokálním serveru, kde probíhá vývoj (můj počítač + virtuální testovací stroj)
- 1× na serveru tojeono.cz (jako texy.info)
- 2× na serveru hostmonster.com (jako nettephp.com a dibiphp.com)
Každé prostředí může mít jiný název. Prostředí 2) a 3) budou mít
nejspíš vždy aktivní režim live. V prostředí 1) budu
vyvíjet nejčastěji v „neživém“ režimu, ale před nahráním na server
si mohu mód live ručně aktivovat a ověřit, jestli všechno
funguje v pořádku. Mezi názvy prostředí a režimy tedy není žádná
přímá souvislost, krom autodetekce.
Viz také:
