Testbench 2.3 is out (finally)

nette php tester Yeah, you heard that correctly. Testbench 2.3 has been released and it brings a lot of new features. I don't want to write about small bugfixes but about real improvements in testing environment. There was always one important mission in Testbench – to make testing easier for newcomers. And I am happy to show you biggest feature in this release: scaffold. Imagine you have your own application but without tests (this is the best situation for scaffolding). Now you can generate whole testing environment using this single command: vendor/bin/run-tests --scaffold tests/bootstrap.php As you can see, you have to prepare bootstrap.php before scaffold. You can find default one in readme. Content of this file can be very simple: ?php require __DIR__ . '/../vendor/autoload.php'; Testbench\Bootstrap::setup(__DIR__ . '/_temp', function (\Nette\Configurator $configurator) { $configurator-addDirectory([ __DIR__ . '/../app', ])- $configurator-addParameters([ …  přečtěte si více

Fix compatibility with Nette 2.4

legacy nette php Právě v těchto dnech přichází další významná minor verze Nette balíčků do vašich vendorů. Událo se velké množství změn a to zejména pod kapotou. To si však s sebou nese určitou daň a tou je potřeba učinit pár úprav v kódu, které zajistí kompatibilitu. Těchto úprav není mnoho. A když už jsou, tak na ně Nette upozorní třeba prostřednictvím E_USER_DEPRECATED. Pokud však pracujete se složitější aplikací, která třeba nebyla původně postavená na Nette, může být taková úprava docela lopota. Zde se tedy nedočtete co je v Nette nového, ale jak co upravit a na co jsem narazil, když jsem tuto kompatibilitu re­šil. Úpravy v Latte Jelikož pracuji na starším projektu, který je…  přečtěte si více

PSR-4 autoloader aplikace

composer nette Nikdy jsem moc nelpěl na PSR-FIG pravidlech. Částečně možná proto, že jsem je nikdy moc nechápal, částečně možná proto, že nemám rád, když mi někdo něco nutí. Nekterá pravidla jsou ale docela fajn (i když se vždy něco najde). Jedním z jich je PSR-4: Improved Autoloading. Jenže proč řešit nějaký autoloading, když v Nette funguje skvěle, ani o tom člověk neví? Fakticky jsou v každém sandboxu použity minimálně 2 autoloadery a mohl bych se tedy ohánět rychlostí, protože: If there must be multiple autoload functions, spl_autoload_re­gister() allows for this. It effectively creates a queue of autoload functions, and runs through each of them in the order they are…  přečtěte si více

Magie zvaná mapping presenterů

nette Ona to vlastně ani není taková magie jako to není nikde pořádně popsané. Než se pustím to obludných složitostí, bylo by vhodné zmínit se co to vlastně mapping presenterů je. Viděli jste někde toto v konfiguraci? application: mapping: *: App\*Module\Presenters\*Presenter Určitě ano, je to totiž vykopírované ze sandboxu. Tato konfigurace říká, kde má Nette hledat presentery. Resp. pod jakým namespace. To je důležité. Na adresářové struktuře totiž v tomto případě vůbec nezáleží. Kdyby v konfiguračním souboru nebyl mapping vůbec uvedený, presenter by musel být bez namespace, tedy například \HomepagePresenter. Pokud by pak zase někdo měl raději MVC, mohl by si jednoduše změnit mapping: application: mapping: *: App\*Module\Controllers\*Controller A používat tak třídu \App\Controllers\HomepageController. Opět na umístění v adresářové struktuře nezávisle. Pojďme se ale ponořit hlouběji a rozeberme si co vlastně jednotlivé části mappingu znamenají. Do hlubin…  přečtěte si více

Rozšíření pro DIC

DIC nette Jednu z věcí, které jsem zde na blogu moc nepopsal jsou rozšíření pro DIC (Dependency Injection Container, potomek Nette\DI\Container). A protože se chci vrátit jednodušším článkům, zaměřím se na úplně základy. Jaká je motivace k psaní rozšíření DIC a co to vlastně je? Své aplikace rozděluji poměrně důsledně na jakési balíčky (bundles – název ze Symfony). Cílem je rozškatulkovat celou aplikaci podle logických celků, tzn. každý bundle by se měl starat pouze o tu svojí věc a zároveň si s sebou nést vše potřebné. Jedná se o balíčky typu Articles, který se stará (jak sám název napovídá) pouze a jenom o články, nebo Eshop, GoPay, Media, Users, atd. Výhodou tohoto přístupu je to, že mohu kdykoliv z balíčku udělat Composer balíček a úplně ho oddělit od aplikace. Zároveň některé balíčky směřují k jednoduchému oddělení do microservices. Nevýhodou je pak to, že je to oproti běžným způsobům jak navrhovat aplikaci poměrně složité. Napsat takto aplikaci většinou zamená zasahovat do nějaký…  přečtěte si více

Jednoduché testování pro úplně každého

nette tester Konec slibů, článek je tu. Tentokrát se rozepíšu o nástroji Testbench. Testbench by měl pomoci s rychlým testováním Nette aplikace. Je zaměřen spíše integračně a vhodně doplňuje Nette\Tester, který je zaměřen spíše jednotkově. Myšlenka, která stála za vytvořením tohoto nástroje je velmi prostá – testování je složité. Je složité hlavně pro lidi, kteří dokonale nerozumí problému. Proto je tento nástroj zaměřen na rychlý start pro úplně každého (kdo si prošel alespoň quickstart a chce testovat). To se projevuje v tom, jak je Testbench postaven (viz další povídání). Testbench se sestává z různých nápadů, které jsem všude možně okoukal za posledních X měsíců a něco mě na…  přečtěte si více

ZČU - Nette je fajn, ale máme raději Javu

nette php přednáška Dnes jsem měl opět tu čest přednášet studentům předmětu KIV/WEB na fakultě aplikovaných věd (ZČU) o tom, jak se dají dělat webové aplikace pomocí webového frameworku. Je to vždy skvělý zážitek. Jako vždy sedělo v publiku (doslova) pár lidí, kteří už mají s frameworkem nějaké základní zkušenosti. Ostatní jsou většinou studenti, pro které je toto první seznámení s webovým světem a právě tato přednáška je jedna z posledních – takový vrchol pomyslného ledovce. Odnesl jsem si asi dva poznatky. Prvně – následující přednáška je moc složitá. Kdybych prezentaci dokázal zkrátit na polovinu, tak by to bylo OK. Není třeba zmiňovat se o DI, routování atd. (to jen spíš taková…  přečtěte si více

Znovupoužitelné části formuláře

nette php Před nějakým časem jsem psal o tom, jak vytvořit znovupoužitený formulář. Nejedná se o nic jiného, než o správné navržení a následné použití komponent, tedy potomků UI\Control. Pokud bych měl být upřímný, nemyslím si, že se formuláře nějak často na webu opakují a osobně tento princip používám spíše pro oddělení části aplikace do samostatného balíčku. Tím spíš najde následující ukázka méně použití. Právě mám totiž za úkol navrhnout předělání jedné administrace. Úkolem není hledět na to, jak moc je tento přístup špatný, ale navrhnout řešení, které nahradí stávající 1:1. Tato administrace obsahuje často se opakující (a velmi rozsáhlý) formulář, který se skládá z několika karet. Navíc některé části formuláře spolu vůbec nesouvisí a na každé stránce je formulář trošku jiný (i když je podobnost zřejmá). Vzhledem k tomu, že se jedná o tak rozsáhlý kód, upustil jsem od znovupoužitelného formuláře a navrhnul jsem znovupoužitelné pouze jeho části. A na následujících řádcích nastíním jak. Na…  přečtěte si více

Od indexu až po presenter

nette php Když jsem se učil pracovat s Nette Frameworkem, musel jsem v začátcích hodně přivírat oči a říkat si „prostě to tak je“. Hodně věcí bylo zahaleno do tmy. Teď už to tak naštěstí není, ale stále se stává, že mi někdo napíše a děkuje za poodhalení a vysvětlení toho, jak to funguje na pozadí (za což zase děkuji já). Pokusím se tedy pokračovat a vrátím se na úplný začátek – do index.php a poodhalím, jak probíhá start takové běžné aplikace. A jako vždy – co nejjednodušeji. Zodpovím (nebo alespoň nastíním odpovědi na) následující otázky: proč redirect vyvolává AbortException jak napsat vlastní NanoPresenter proč má Nette dva request objekty kde se bere životní cyklus presenteru Start aplikace Nedávno jsem dostal v práci na starost implementovat Nette do jednoho legacy projektu. Už jsem tu o tom psal. Byl to nesmírně vyčerpávající úkol, ale už mám hotovo a jsem ve fázi nekonečného refaktoringu. Jednou z prvních věcí, které bylo nutné vyřešit byl start aplikace z jednoho místa.…  přečtěte si více

Ještě lepší struktura Nette aplikace

doctrine kdyby nette Každý, kdo postavil pár aplikací, musel vždy řešit ten samý problém. Jakou strukturu by měla aplikace mít? A co když se začne projekt rozrůstat? Měl bych se držet toho jak to dělá sandbox (resp. web-project)? Postupem času jsem dokonvergoval k relativně přijatelnému výsledku a vzhledem k tomu, že projekt na kterém jsem to poprvé pořádně rozjel byl ukočen, rozhodl jsem se jej zveřejnit. Už je to sice nějaký čas, ale v době největšího vrcholu tohoto projektu jsem jej považoval za takovou osobní špičku. A to hned z několika důvodů. K tomu se ale dostanu postupně. A vezmu to pěkně od těch nejmenších částí. Presentery a komponenty U presenterů se mi vlastně docela líbí…  přečtěte si více