Na navigaci | Klávesové zkratky

Pět důvodů upgradovat na Nette 2.2.3

Mám skvělý pocit z právě vydané verze Nette 2.2.3, protože se tam podařilo vychytat řadu drobností, počínaje chytřejším rozpoznání chyb u nativních funkcí, přes výstižnější chybové hlášky DI kontejneru, až po různé novinky (viz release notes). Už jsem ji nasadil na všechny své weby a běží výborně.

Rád bych vypíchl 3 užitečné novinky. První se týká Latte a jde o funkci invokeFilter(), kterou můžete volat filtr i mimo šablonu:

$latte = new Latte\Engine;
$latte->addFilter('upper', 'strtoupper');
$upper = $latte->invokeFilter('upper', array('abc')));
// obdoba {'abc'|upper} v šabloně

Druhá novinka se týká Tracy. Ta nyní dokáže logovat chyby jako je E_NOTICE v plné náloži (tj. s HTML souborem), jako když loguje výjimky. Které chyby má takto logovat nastavíte do proměnné $logSeverity:

Tracy\Debugger::$logSeverity = E_NOTICE | E_WARNING;

Třetí novinka souvisí s bezpečností. Třída Configurator má metodu setDebugMode(), pomocí které určujete, zda aplikace poběží v produkčním nebo vývojářském režimu. Raději jí nikdy nepředávejte argument true, může se pak snadno stát, že to deploynete na ostrý server a máte hned bezpečnostní kráter. Správné je jako argument předat IP adresy, pro které chcete vývojářský režim na ostrém serveru povolit:

$configurator->setDebugMode('23.75.345.200');

Jenže IP adresy se mohou měnit a dostane ji někdo jiný. Proto je nově možné přidat ještě pojistku v podobně cookie. Do cookie nazvané nette-debug si uložíte tajný řetězec (buď funkcí setcookie nebo pomocí vývojářského nástroje prohlížeče, každopádně nezapomeňte na příznak httpOnly), například mysecret a necháte Configurator, aby ověřoval i jej. Teprve sedí-li IP adresa i hodnota v cookie, bude aktivován vývojářský režim:

$configurator->setDebugMode('mysecret@23.75.345.200');

Čtvrtá novinka ze tří se týká DI kontejneru a je velmi dobře skrytá. Dovoluje nastavit, které třídy vynechat z autowiringu. Typickým kandidátem je Nette\Application\UI\Control, kterého vám může DI kontejner cpát třeba do konstruktoru formuláře. Seznam ignorovaných tříd předáte metodě ContainerBuilder::addExcludedClasses(). K té se dostanete například v bootstrap.php:

$configurator->onCompile[] = function($configurator, $compiler) {
	$compiler->getContainerBuilder()->addExcludedClasses(array(
		'stdClass',
		'Nette\Application\UI\Control',
	));
};

A do pětice všeho dobrého: při vývoji můžete narazit na upozornění Possible problem: you are sending a HTTP header while already having some data in output buffer. Try OutputDebugger or start session earlier. To se objeví, když se snažíte odeslat HTTP hlavičky, a ono to sice ještě jde, nicméně aplikace už nějaký výstup předtím odeslala, jen ho zachytil output buffer. V takové situaci je nejlepší nastartovat OutputDebugger a zjistit, odkud se výstup posílal a předejít tomu. Od verze 2.2.3 máte také možnost toto dobře míněné upozornění potlačit pomocí proměnné Nette\Http\Response::$warnOnBuffer. Třeba opět z bootstrapu:

$container->getByType('Nette\Http\Response')->warnOnBuffer = false;

Komentáře

  1. Jakub Vrána #1

    avatar

    Secret by měl být hash. Pokud jsou zdrojové kódy veřejné nebo uniknou, tak by to útočníkovi nemělo dát munici navíc. IP adresa je v tom případě zbytečná.

    před 10 lety | reagoval [2] David Grudl
  2. David Grudl #2

    avatar

    #1 Jakube Vráno, nad tímhle jsem dlouho přemýšlel a nakonec se rozhodl hash nepoužít. Důvodem je snazší nasazení a fakt, že hash se musí počítat při každém požadavku, takže by tam stejně nebyla moc silná funkce. Unik kódu představuje zřejmě větší problém, než únik tohoto tokenu.

    Vazbu na cookie beru jako méně silnou ochranu než vazbu na IP, takže určitě to chci mít v kombinaci.

    před 10 lety
  3. Jakub Vrána #3

    avatar

    Hashovací funkce může být velmi rychlá, protože vstup může být dlouhý, vývojář si ho nemusí pamatovat.

    před 10 lety
  4. Petr #4

    avatar

    Ahoj,
    hezké, hlásím, že upgrade z 2.2.2 proběhl zcela bez problémů. Jen jak bude fungovat

    $configurator->setDebugMode('secret@23.75.345.200');

    pro nastavení více ip adres? Mají se napsat odděleně čárkou?
    Díky moc,
    Petr

    před 10 lety | reagoval [5] David Grudl
  5. David Grudl #5

    avatar

    #4 Petře, buď jako pole ['secret@ip', 'secret2@ip2'] nebo řetězec oddělený čárkami či mezerami.

    před 10 lety
  6. Felix #6

    avatar

    Můžu se zeptat jak se ten OutputDebugger používá? Nenašel jsem žádný přiklad, ani test. =/

    před 10 lety | reagoval [7] David Grudl
  7. David Grudl #7

    avatar

    #6 Felixi, hned po načtení autoloadingu v bootstrapu zavolej Tracy\OutputDebugger::enable() a vypíše se ti přehled, kde a co aplikaci vypisuje.

    před 10 lety
  8. Ondra Votava #8

    avatar

    A da se nejak vystup OutputDebbugeru nasmerovat do DebugBaru?

    před 10 lety

Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.


phpFashion © 2004, 2024 David Grudl | o blogu

Ukázky zdrojových kódů smíte používat s uvedením autora a URL tohoto webu bez dalších omezení.