Ohlas na školení Nette

Školení, která pořádám

David Grudl mě pozval na školení Úvod do Nette Framework a musím říct, že stráveného času nelituji.

Nette Framework

Při úvodním představování jsem o sobě řekl něco jako: „Nikdy jsem si nenapsal vlastní PHP framework a k většině PHP frameworků mám odpor. Nette je první, ke kterému odpor nemám.“

Nette je pro mě samé příjemné překvapení. Kupříkladu třída Debug: přehledné zobrazování chyb je podle mě to nejmenší a za mnohem důležitější považuji řízení chyb – na vývojovém serveru se chyby vypisují, na ostrém logují a informace o neprázdném logu se volitelně odesílá e-mailem. To je přesně to, co doporučuji posluchačům na školení bezpečnosti, i když sebekriticky musím říct, že odesílání informace o chybách e-mailem jsem řešil jen jednou (pomocí cronu) a jinde zůstalo u namátkové kontroly.

Stejně tak formuláře – většinou dělám validaci u klienta a na serveru už jen sanitizaci (např. validaci maximální délky řetězce u klienta řeší atribut maxlength, sanitizaci na serveru potom automatický ořez při ukládání do databáze). Z pohledu bezpečnosti aplikace to je v pořádku (ať už uživatel pošle jakákoliv data, tak se sanitizace postará o to, že data aplikaci nijak nepoškodí), ale třeba u složitějších validacích řešených JavaScriptem je sanitizace na serveru neslušná vůči uživatelům s vypnutým skriptováním. Některá data (např. e-mailovou adresu) navíc sanitizovat nejde a je potřeba je validovat i na serveru. Nette automaticky data i na straně serveru validuje.

Nejsem příznivce primitivních objektových obálek. Jistě se dá napsat objekt, který mi zpřístupní session proměnné, ale co z toho, když s nimi lze pracovat přímo? Nette přináší u session proměnných přidanou hodnotu v podobě jmenných prostorů a najednou objektové rozhraní dává dobrý smysl.

Nette je navíc pěkné nejen zvenku, ale i při pohledu do zdrojových kódů. Většina úloh se dá řešit více způsoby, z nichž většina je špatně (i když jakž takž fungují), a to skutečně správné řešení zná málokdo. Někdy lze třeba už jen z nadpisu článku poznat, že bude s největší pravděpodobností obsahovat chyby. U Nette tomu tak není – na co jsem se podíval (a co by většina programátorů napsala špatně), to bylo správně. Vzorové řešení, sám bych to napsal stejně… Je zkrátka vidět, že členové Nette Foundation mají vynikající analytické myšlení a s programováním bohaté zkušenosti. Na pár mírně závažných bezpečnostních chyb jsem narazil, ty byly ale obratem opraveny.

Dokonce i Nette aplikace, ke kterým jsem byl trošku skeptický, beru na milost. Oddělení pohledu a aplikační logiky už stejně používám, jen jsem ještě přemýšlel nad vhodným způsobem vyčlenění SQL dotazů. Nette to dělá rozumným způsobem, model zkrátka nemusí představovat jen ORM. Aplikace v Nette tak můžu psát obdobně jako doteď, jen zadarmo dostanu třeba promyšlené routování (kde hlavní přínos vidím v oddělení URL od zápisu v pohledu). Nette zkrátka nehází klacky pod nohy.

Školení

David na školení nepoužívá prezentaci, což obecně vzato hodnotím kladně, protože přednáška není nudná a je spíše praktická. Já na rozdíl od něj při školení prezentace používám (i když mám také hodně praktických ukázek a na slajdech jsou jen stručné body) a vidím v tom dvě výhody – těžko zapomenu něco říct a pokud posluchač třeba přeslechne, o čem se zrovna mluví, tak to podle prezentace zjistí.

Davida také překvapilo, že lektorský počítač nebyl nainstalovaný, takže školení začalo o půl hodiny později (a skončilo o hodinu později).

Zmiňuji to jen proto, že čistě pozitivní komentáře jsou nedůvěryhodné :-). Jinak bylo školení vedeno výborně, s řadou živých vstupů z klávesnice a podnětného povídání v mezičase. Na přednáškách si většinou stihnu číst maily a webové články, tady na to nedošlo, protože informačně chudých míst bylo minimum. Odpoledne navíc David přednášel téměř bez přestávky.

Závěr

I kdybyste celé Nette používat nechtěli (a já pro to ještě nejsem pevně rozhodnut), tak je školení hodně inspirativní. Jednotlivé části Nette lze používat nezávisle na celku a informace uvedené na školení jsou přínosné i samy o sobě. Vzhledem k obsažnosti tématu bych ale doporučil spíše dvoudenní školení Vývoj webových aplikací v Nette Framework.

Jakub Vrána, Osobní, 25.3.2009, diskuse: 26 (nové: 0)

Diskuse

Adam:

Tedy článek pěkný, ale podle mě jakoukoliv pochvalnou recenzi znedůvěryhodní, pokud autor na recenzovaný produkt odkáže affil odkazem :)

ikona Jakub Vrána OpenID:

Veřejně se zavazuji, že případný výtěžek affiliate programu přenechám Institutu Školení PHP. Speciální odkaz tam je kvůli tomu, že mě zajímá, kolik lidí se na školení z tohoto článku přihlásí.

MArtin:

"Institutu Školení PHP", "Nette Foundation", to jsou krásně znějící názvy! Co takhle místo nich používat jejich pravý význam, a to "David Grudl, samojediný"?

Nazývejme věci pravými jmény...

ikona Jakub Vrána OpenID:

Právě, že věci nazývám pravými jmény. To, že je členem Nette Foundation (pokud vím) jenom David, ještě neznamená, že to tak musí být napořád. V článku jsem to nicméně samozřejmě uvedl jako vtípek, ale vtipy se vysvětlovat nemají… A „Institut Školení PHP“ pokud vím tvoří David Grudl a Martin Mayer.

Washo:

Kdyz pises o tom, ze jsou pouzitelne treba jen casti nette, tak to co je podle me asi nejlepsi na Nette, je RobotLoader. Proste uz nevim jak bych bez nej existoval. Umoznuje cloveku nepremyslet nad tim kdy zavola require a zachovava svodobu organizace souboru s definicemi trid nezavisle na:
- pevne predepsane adresarove strukture
- nazvu souboru; nemusi byt nazvem tridy
- poctu trid v souboru; muzu mit vice trid v jednom souboru (napriklad tridu a k ni exceptions)

RobotLoader je proste super a zeptam se... nevite kde jinde ve svete PHP je k dispozici?

ja:

Autoload ma dneska snad kazdy lepsi framework ne? Zend i Symfony urcite umi...

Washo:

Nj. Ale co ja jsem naposledy delal se zendem tak to fungovalo proste tak ze trida Zend_Db_Table musela byt v adresari Zend/Db/Table. RobotLoader toto nevyzaduje.

ikona v6ak:

No, jinými slovy:
Umožňuje to udělat si v tom naprostý svinčík.
Nic proti Nette, ale RobotLoader je dvojsečná zbraň. Těm, kdo ho umí použít, to ulehčí trošku práce. A ti, kdo to neumí, si v tom nadělají svinčík.

ikona v6ak:

Ještě zdůrazňuji, že se mi Nette z velké části líbí. A na některých místech se mi nelíbí možná jen kvůli mé neznalosti.

Washo:

No jasne ze to je dvojsecna zbran, stejne jako jakykoliv cely framework. Ale precejen... aby nazvy trid otrocky sledovaly adresarovou strukturu mi neprijde jako neco, co by se dalo nazvat uspesnou metodikou pro organizaci dat v aplikaci. Nevim, kazdy jak chce. Je to pouze muj nazor, nemam to nijak podlozene merenim nebo nejakym hlubsim vyzkumem (jak to byva na tomto blogu zvykem).

Washo:

Jeste BTW... dneska jsem po dlouhe dobe otevrel jeden projekt ktery jsem delal v Zend FW a potreboval tam neco dodelat... Ne... ten komfort prace se proste neda srovnavat.

ikona david@grudl.com:

To je moc silné tvrzení. Nelze přece černobíle tvrdit, že buď použiju striktně systém PEAR/Zend, nebo ne a pak v tom mám svinčík.

ikona v6ak:

Já netvrdím, že si takto člověk v každém případě udělá svinčík. Ale pevný systém je podle mého názoru zpravidla lepší. Momentálně mě nenapadá důvod to dělat jinak. A mít více tříd v jednom souboru? Ať na to mám jakýkoli názor (byť o něco méně striktní než Zend, jak je známo z mého článku o private class v php), tak autoload to umožňuje i bez RobotLoaderu. Jen je potřeba mít systém.

RobotLoader je silná zbraň a je jen na uživateli, kam ji namíří...

A pokud je v tom systém, pak princip RobotLoaderu není nezbytně nutný.

BTW: Nelíbí se mi považovat kontroverzní RobotLoader za nejlepší část Nette. (Tím neříkám, že bych ho nikdy nepoužil.)

Tomáš Fejfar:

citace z http://phpfashion.com/jak-snadno-psat-spickove-webove-aplikace: "...a pozor – nemusejí zaměstnance školit na svůj proprietární systém!" Proto je systém Zendu lepší. Dej programátorovi volnost a vymslí "svůj nejlepší systém" :)

ikona david@grudl.com:

Děkuji moc Jakube za tak pozitivní ohlas a řadu korektur a bugfixů.

Palo:

Mohli by ste mi prosím objasniť objavenú bezpečnostnú chybu v TextBase.php? Čo presne bolo jej riziko?

LLook:

Je to vidět z diffu: Při přidávání filtrů (addFilter()) se nekontrolovalo, jestli onen filtr existuje.

Pokud by ses překlepl a přidal jako filtr funkci, která neexistuje, tak by se po odeslání na datech zavolala neexistující funkce přes call_user_func() (v metodě setData()), což by vyvolalo E_WARNING, do hodnoty by se dosadil prázdný řetězec a skript by jel dál (pokud warningy nezachytáváš třeba Laděnkou).

Pokud by se ti takový překlep dostal třeba k políčku pro nastavení hesla, mohl by to být průser, najednou by si uživatelé nastavovali prázdné heslo... Těžce nepravděpodobný scénář (proto Jakub píše pouze o "mírně závažných" chybách), ale opatrnosti kolem zpracování vstupních dat není nikdy nazbyt.

ikona david@grudl.com:

Jakub myslel chybu v regulárním výrazu pro kontrolu emailové adresy, který akceptoval i mezery uvnitř adresy. Plus mi ještě poslal celou řadu dalších připomínek a bugreportů.

Washo:

Jednalo se nekde o takovou chybu, kvuli ktere by bylo temer nezbytne pouzit aktualni nejnovejsi revizi pro vsechny stavajici projekty? Tykaly se bugreporty i jine casti frameworku nez Formsu?

ikona david@grudl.com:

Nechtěl bych to dramatizovat. Framework vylepšuji pořád a vždy novější verze je lepší než starší. Nějaký fatální bug nebo zásadní bezpečnostní díra v kódu snad nikdy ani nebyla.

Srigi:

Ako rychlo sa taketo opravy premietnu do balikov, ktore je mozne stiahnut na oficialnej stranke? Predsa len, tahat opravnu verziu z "trunku" nie je pohodlne (hlavne ak ma clovek Windows a nema svn klienta).

ikona david@grudl.com:

Balíky se aktualizují krátce po vydání každé (otestované) revize.

ikona Jakub Vrána OpenID:

Nepřesná kontrola e-mailu mohla způsobit třeba to, že se pomocí formulářů dal rozesílat spam. To ovšem jen za předpokladu, že se e-mailová adresa předala funkci mail(), která je k tomu náchylná. Pokud se předala nějaké další vrstvě, která adresy taky kontroluje, tak tato vrstva mail nejspíš odmítla odeslat. U stávajících aplikací se starší verzí Nette je vhodné ujistit se, že se před odesláním e-mailu provádí nějaká nezávislá kontrola adresy. Pokud jsou e-maily uložené třeba v databázi, je vhodné je překontrolovat.

Chybějící Order Allow,Deny mohlo útočníka dovést k některým souborům v aplikaci (např. config.ini nebo templates/). To ovšem jen za předpokladu, že byla ponechaná výchozí Order Deny,Allow, někde jinde v konfiguraci Apache byla nastavená direktiva Allow a zároveň nebyla dodržena doporučená struktura Nette aplikací, která káže aplikaci ukládat mimo DocumentRoot. U stávajících aplikací je vhodné překontrolovat, že buď leží mimo DocumentRoot nebo do .htaccess doplnit Order Allow,Deny.

ikona Jakub Vrána OpenID:

addFilter() jsem nepřipomínkoval, jen se to náhodou dostalo do stejného commitu.

Maleš:

Pěkný článek, osobně používám Zendovský framework a jsem spokojen, podle mě skvěle napsaný, téměř se vším a co mu chybí tak si doplním vlastní knihovnou na míru. Ovšem chci zkusit jiný framework pro porovnání a myslím, že Nette nebude špatná volba.

Vy jste zkoušel jiný (popřípadně Zend)?

ikona Jakub Vrána OpenID:

Praktickou zkušenost s jiným PHP frameworkem nemám - jak jsem psal, dělají se mi z toho osypky. Je pravda, že když někdo chce doporučit framework a nechce Nette, tak mu doporučím Zend Framework, ale mě osobně od něj odradila přednáška http://2008.webexpo.cz/prednaska/novinky-v-zend-frameworku-16/. Ta ve mně vyvolala pocit, že se jeho vývoj dostal do stavu, kdy se nedá dosáhnout kvalita.

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2018 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.