Připravil: Ing. Jiří Lýsek, Ph.D. Verze: 3.4.2015 Webové aplikace Šablonovací systémy, ORM, MVC, MVP, Frameworky, Testování
strana 2 Otázka k zamyšlení: Dokázali byste napsat server-klient aplikaci s GUI a databází v relativně krátkém čase v něčem jiném než HTML/PHP? asi ne v PHP to umí kde kdo (i děti na ZŠ) mohou to dělat dobře? jakou?
strana 3 Tvorba software a návrh Dobrý návrh aplikací je důležitý pro větší projekty udržovatelnost testovatelnost termín dodání vlastní psaní kódu je dílčí část procesu v PHP se píšou aplikace malé i velké je snadné začít může být těžké růst aby kód mohl upravovat i někdo jiný, aby mohlo spolupracovat víc vývojářů volte správné nástroje pro vaše cíle
strana 4 Návrhový vzor znovupoužitelné řešení nějakého problému Programování Elektrotechnika Strojírenství Základní jednotka Řádek kódu Součástka (kondenzátor, odpor, dioda, ) Celek Funkce, třída Elektrický obvod (zapojené součástky) Funkční celek Vrstva aplikace, knihovna Osazený plošný spoj (zesilovač, zdroj, trafo, ) Produkt Software Zařízení Stroj Díl (hřídel, ozubené kolo, šroubek, ) Sestava (převod, sešroubované díly, ložisko, ) Spojka, motor, převodovka, diferenciál
strana 5
strana 6 Počátky PHP do r. 2005 malé aplikace napsány jako mix PHP a HTML kódu větší aplikace procedurálně + šablona podpora objektů reálně funkční až od PHP5
strana 7 Šablonovací systémy např. Smarty, Twig, Latte a různá jiná řešení (i vlastní) Šablony se kompilují do PHP obvykle se parsují pomocí regulárních výrazů caching
strana 8 Šablonovací systémy - výhody Oddělení PHP a HTML oddělení prezentační logiky od aplikační přehlednost dělitelnost práce rychlost, odbornost, náklady Bezpečnost XSS htmlspecialchars()
strana 9 Šablonovací systémy - nevýhody ne vždy podpora syntaxe v IDE Netbeans + Latte je OK člověk si musí pamatovat názvy proměnných je důležitá komunikace programátor <-> kodér je nutné napsat dokumentaci
strana 10 Šablonovací systémy princip zkompilovaná šablona uložená v mezipaměti PHP kód cache šabloně se předají proměnné a načte se jako PHP kód přes include
strana 11 Šablonovací systémy ukázka //$data je asoc. pole function runtemplate($tmpl, } extract($data); include("dir/". $tmpl); array $data) {
strana 12 Šablonovací systémy ukázka {if($form->haserror())} <p>chyba...</p> {endif}
strana 13 Šablonovací systémy kompilace $script = preg_replace( ' {if\((.+?)\)} i', '<?php if(\\1) {?>', $script); $script = preg_replace( ' {end[a-z]*} i', '<?php }?>', $script);
strana 14 Šablonovací systémy ukázka <?php if($form->haserror()) {?> <p>chyba...</p> <?php }?>
strana 15 Šablonovací systémy ukázka {if($form->haserror())} <p>chyba...</p> {endif} <?php if($form->haserror()) {?> <p>chyba...</p> <?php }?>
strana 16 Šablonovací systémy ukázka <table> {foreach($var as $k => $v)} <tr><td> </td></tr> {endforeach} </table>
strana 17 Šablonovací systémy ukázka <table> <?php foreach($var as $k => $v) {?> <tr><td> </td></tr> <?php }?> </table>
strana 18 ORM Object Relational Mapping mapuje databázi na objekty využívá cizí klíče nebo konfigurační soubory pro relace Vzory (design pattern): Active record Data mapper Generátory kódu
strana 19 ORM výhody a nevýhody výhody není nutné psát jednoduché SQL je nutné upravit strukturu DB některé ORM např. nepodporují kompozitní klíče nevýhody složitější dotazy a spojení tabulek se někdy realizují složitě
strana 20 ORM Active record objekty si řeší práci s DB samy $obj->save(), $obj->delete(); Data mapper práce s DB přes další objekt tzv. "mapper" $mapr->save($obj), $mapr->delete($obj)
strana 21 Active record vs Data mapper co dělat se smazanou instancí? Active record objekt obsahuje DB metody jako insert delete update Data mapper entita neobsahuje DB metody mapper může pracovat nad různými úložišti Mapper může vrátit instanci podle dat
strana 22 ORM ukázka - Active Record $user = new User(); $user->load(5); $user->email = ' '; $user->save(); $user->savetofile( ); třída User je asi mix SQL kódu a logiky modelu a asi spousta dalšího
strana 23 ORM ukázka - Data mapper co to je a odkud? $daodb = daosql::users(); $user = $daodb->get(5); if($user instanceof Admin) { } $user->email = " "; $daodb->store($user); entita User je nezávislá na úložišti $daofile = daofile::user(); $daofile->store($user);
Active record vs Data mapper strana 24
strana 25 MVC a MVP M = model kód měnící data v DB V = view prezentační vrstva C = controller P = presenter
strana 26 MVC vs MVP MVC controller sleduje akce uživatele a předá informace o změně do view více pro desktop nebo RIA MVP presenter předává data view a to na základě dat zobrazí celé rozhraní vhodné pro klasický web view je na klientské straně (oddělené a pasivní)
MVC vs MVP strana 27
strana 28 Realita webových aplikací nebo presenter?
strana 29 MVC nebo MVP? hlavně oddělit business logiku (M), zobrazovací logiku (V) a aplikační logiku (C/P) závisí více na technických prostředcích MVW - Model View Whatever
MVC v PHP strana 30
MVC v JS strana 31
strana 32 PHP Frameworky ucelené systémy určující způsob práce knihovny architektura aplikace
PHP frameworky - Google trends strana 33
strana 34 Který si vybrat moderní, bezpečný a vyvíjený vhodný pro můj cíl s dobrou dokumentací používající nástroje, které znám Composer, Git, PhpUnit, s velkou (aktivní) komunitou
strana 35 Framework VS knihovna Inversion of control Framework řídí vás, knihovnu řídíte vy Framework = ucelená sada myšlenek a postupů složená z knihoven a sladěná tak, aby co nejlépe plnila svůj účel
strana 36 Funkce (výhody) frameworku Definuje architekturu aplikace např. MVP, push based, pull based Zlepšuje testovatelnost aplikace Poskytuje: práce s URL (routing) šablonovací systém API pro databázi (např. ORM)
strana 37 Funkce (výhody) frameworku API pro HTTP data a formuláře GET a POST, COOKIE, SESSION, soubory migrace DB seedy DB některé mají CLI generování modelů a DB migrací seedování databáze spouštění testů práce v týmu command line interface
strana 38 Nevýhody frameworku Ne každému musí vyhovovat to, co autorovi frameworku je možné použít jiný framework což ale nejde, pokud máte projekt z poloviny hotov nebo taky žádný MVC lze realizovat různě (není to složité) lze si vybrat knihovny a používat je
strana 39 Zpracování požadavku frameworkem obvykle se vše posílá přes index.php framework podle cesty v URL osloví správný presenter - routing spustí akce modelu (CRUD) předá data z modelu do šablony šablona vygeneruje HTML HTML se pošle přes HTTP
strana 40 Pretty (friendly, nice, semantic, ) URL a mod_rewrite Modul pro HTTP server Apache, na základě pravidel přesměruje HTTP požadavek soubor.htaccess regulární výrazy RewriteCond %{REQUEST_FILENAME}!-f RewriteRule ^(.*)$ index.php?q=$1 [L,QSA] L = last QSA = query string append
strana 41 Pretty URL a mod_rewrite routing zpracuje parametr "q" a předá další parametry presenteru některé routery dokážou např. podle "id" načíst instanci modelu http://www.server.cz/clanek/detail?id=500 => http://www.server.cz/index.php?q=clanek/detail&id=500
strana 42 Pretty URL a mod_rewrite někdy má entita přímo fragment URL unikátní klíč nad sloupcem varchar(n) router předá pojmenovaný fragment do presenteru route: produkt/{$producturl} http://www.server.cz/produkt/sklenice-na-pivo => http://www.server.cz/index.php?q=produkt/sklenice-na-pivo
strana 43 Composer Systém pro stahování aplikačních balíčků Konfigurace v JSON souborech obdobné nástroje i pro jiné ekosystémy Bower (JS), Gem (ruby), Pip (Python) https://getcomposer.org/
strana 44 Composer příkazy CLI composer install instalace podle composer.lock souboru (zajistí všem vývojářům stejnou verzi) composer update aktualizace možnost stažení např. sandboxu pro nový projekt
strana 45 Git systém pro správu verzí kódu pracuje lokálně + centrální úložiště větve CLI push, pull, commit, add, merge, rebase Github, Bitbucket systém SVN se v podstatě nepoužívá
strana 46 Framework Nette Český MVP framework David Grudl a Nette foundation bezpečný, moderní Hlavní součásti: Latte šablony Tracy (Laděnka) Dibi a Nette databases Adminer Konfigurace ve formátu Neon
strana 47 Nette - šablony Latte makra http://doc.nette.org/cs/2.1/default-macros dědičnost (layout) místo generování URL píšete volání funkcí (presenter)
strana 48 Nette - Tracy (Laděnka) pomocník pro ladění aplikace vyjímky a výpisy chbových hlášení měření času SQL dotazy http://doc.nette.org/cs/2.1/debugging
strana 49 Nette - databáze - Dibi a Database ORM vrstva Dibi v podstatě rozšiřuje PDO::prepare() není ORM ORM Nette\Database http://doc.nette.org/cs/2.1/database založená na notorm http://www.notorm.com/
strana 50 Nette - databáze Je možné použít např. ORM Doctrine DQL jazyk objektový dialekt SQL podobná, ale jiná syntaxe a hlavně logika podobný Hibernate (Java) $query = $em->createquery('select u FROM MyProject\Model\User u WHERE u.age > 20'); $users = $query->getresult();
strana 51 Adminer Je použit jako základní administrační nástroj podobný jako PHPMyAdmin existuje verze Adminer Editor podpora různých DB (přes PDO) http://www.adminer.org/cs/
Adminer strana 52
strana 53 Ostaní Frameworky Laravel Eloquent ORM, šablony Blade Symphony Doctrine ORM, šablony Twig CakePHP Code Igniter yii...
strana 54 Shrnutí Frameworků je mnoho Výběr není snadný, ale jsou podobné Je to jen nástroj
strana 55 Jiný přístup Aplikace na serveru realizuje pouze REST API REST = Representational State Transfer Vše ostatní napsáno jako JS aplikace pomocí JS frameworku šablony zpracované také pomocí JS např. Angular JS
strana 56 REST API jen jedna URL např. /api/clanky GET POST - vytvoření nového PUT - aktualizace DELETE
strana 57 Testování webových aplikací Codeception http://codeception.com/ Akceptační testy Funkcionální testy Unit testy - PHPUnit každé testové prostředí je možné upravit/rozšířit
strana 58 Proč testy? Kvalita kódu kódu s testy lze dlouhodobě důvěřovat co funguje dnes, nemusí fungovat zítra, ale jen testy to můžou odhalit ale nemusí Při práci v týmu nemůžete vědět, co změna ve vaší části kódu způsobí jinde to samé při delší přestávce ve vývoji
strana 59 Codeception výhody jednoduchá instalace testy psané v PHP ovládání přes příkazový řádek umí pracovat s různými frameworky framework musí mít plugin pro Codeception nevýhody nemá podporu v NetBeans a jiných IDE
strana 60 Akceptační testy Selenium Server http://www.seleniumhq.org/download/ simuluje chování návštěvníka, pomalé $I->wantTo('add a task'); $I->amOnPage("/"); $I->wait(1); $I->seeElement("form[name=add]"); $I->seeElement("form[name=add] input[type=submit]"); $I->fillField("title", "ukol 1"); $I->click("form[name=add] input[type=submit]"); $I->wait(1);
strana 61 Funkční testy podobné jako akceptační odešle HTTP požadavek, očekává že se něco např. objeví v DB nepotřebují prohlížeč jsou rychlejší je nutná podpora ze strany aplikace/frameworku jinak si musíme napsat vlastní plugin pro codeception
strana 62 Akceptační + funkční testy PhpBrowser HTTP klient bez renderování HTML WebDriver spolupracuje se Selenium server
strana 63 Unit testy Samostatné testování PHP tříd Codeception využívá PHPUnit PHPUnit má podporu v NetBeans a jiných IDE
strana 64 Zajímavosti Phalcon PHP framework jako modul pro PHP Ruby on Rails (RoR) framework postavený na jazyku Ruby v jisté době velmi populární a propagovaný, inspirací pro mnohé jiné frameworky Node.js serverside/cli JS systém