EN | CS | Přihlásit | Registrovat

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::DE­VELOPMENT, Environment::PRO­DUCTION nebo Environment::CON­SOLE.

Příklad

…a přímo ze života: mám jednu aplikaci, která běží v pěti různých prostředích:

  1. 2× na lokálním serveru, kde probíhá vývoj (můj počítač + virtuální testovací stroj)
  2. 1× na serveru tojeono.cz (jako texy.info)
  3. 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é:

Vylepšení zápisu phpdoc direktiv (rev. 481) – changelog


Komentáře Comments feed

mino | 19. 3. 2010, 19:48 | comment

ako napriklad tuto premennu variable.foo = %bar% world …ako to foo pouzijem v aplikaci?

Jan Tvrdík | 19. 3. 2010, 22:06 | comment

Environment::getVariable('foo');

Login to submit a comment