Na navigaci | Klávesové zkratky

Translate to English… Ins Deutsche übersetzen…

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 http://php.vrana.cz/ #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 2 lety | odpovědět | reagoval [2] David Grudl
  2. David Grudl http://davidgrudl.com #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 2 lety | odpovědět
  3. Jakub Vrána http://php.vrana.cz/ #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 2 lety | odpovědět
  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 2 lety | odpovědět | reagoval [5] David Grudl
  5. David Grudl http://davidgrudl.com #5

    avatar

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

    před 2 lety | odpovědět
  6. Felix http://jfx.cz #6

    avatar

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

    před 2 lety | odpovědět | reagoval [7] David Grudl
  7. David Grudl http://davidgrudl.com #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 2 lety | odpovědět
  8. Ondra Votava #8

    avatar

    A da se nejak vystup OutputDebbugeru nasmerovat do DebugBaru?

    před 2 lety | odpovědět

Zanechat komentář

Text komentáře
Kontakt

(kvůli gravataru)



*kurzíva* **tučné** "odkaz":http://example.com /--php phpkod(); \--