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ž 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]
php.date.timezone = "Europe/Prague"
php.iconv.internal_encoding = "%encoding%"
php.mbstring.internal_encoding = "%encoding%"
php.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
Příklad config.ini souboru s rozšířenou syntaxí:
V názvu sekce lze použít tečky pro vytvoření podsekcí.
[production.database.params]
host = db.example.com
username = dbuser
password = secret
Dědění podsekcí.
[production.test < production.database]
host = localhost
V rámci sekce pak lze vypnout dělení klíčů pomocí tečky – za název sekce se přidá vykřičník – tečky jsou poté brány jako součást názvu direktivy.
[common.ip!]
127.0.0.1 = localhost
192.168.1.1 = router
Následující blok kódu demonstruje, jak lze s konfiguračními soubory pracovat:
// načtení a kontrolní 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 vygenerován
$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(); // načte z config.ini sekci [mujpocitac]
Název prostředí je libovolný řetězec, na kterém žádná logika v Nette nestojí.
V případě většího množství prostředí není nutné přepisovat
všechna společná nastavení do každého prostředí zvlášť.
Následující kód (zkopírovaný z ukázkového souboru na začátku této
stránky) zajistí, že i v prostředí production se použijí
nastavení z prostředí common
[production < common]
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
production, 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 production určuje, jestli aplikace
běží na ostrém (produkčním) serveru nebo ne. Proto také existuje zkratka,
místo Environment::getMode('production') lze volat
výstižnější Environment::isProduction(). Pro režim
console existuje obdobná zkratky
Environment::isConsole().
Autodetekce pracuje na principu zjištění IP adresy serveru ( ze
$_SERVER['SERVER_ADDR'] ) a v případě shody s některou
z klasických IP adres používaných v intranetu se režim nastaví na
debug. Manuální nastavení režimu v konfiguračním souboru má
vyšší prioritu než autodetekce, a na zkušebním serveru (běžícím
například na localhostu tj. na 127.0.0.1) ho lze vyvolat pomocí příkazu
mode.{režim} = TRUE
tj. například produkční mód se aktivuje přes
mode.production = TRUE
Autodetekce názvu prostředí úzce souvisí s detekcí režimů
production & 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 nette.org 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 production. 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 production 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é:
- Nette\Config API reference
- Nette\Configurator API reference
- Nette\Environment API reference
- Nette\ServiceLocator API reference
Vylepšení zápisu phpdoc direktiv (rev. 481) – changelog




mino | 19. 3. 2010, 19:48 | comment
ako napriklad tuto premennu variable.foo = %bar% world …ako to foo pouzijem v aplikaci?