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
aby kód mohl upravovat i někdo jiný, aby mohlo spolupracovat víc vývojářů
– 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
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, …)
Díl (hřídel, ozubené kolo, šroubek, …)
Celek
Funkce, třída
Elektrický obvod (zapojené součástky)
Sestava (převod, sešroubované díly, ložisko, …)
Funkční celek
Vrstva aplikace, knihovna
Osazený plošný spoj (zesilovač, zdroj, trafo, …)
Spojka, motor, převodovka, diferenciál…
Produkt
Software
Zařízení
Stroj
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, array $data) { extract($data); include("dir/" . $tmpl); }
strana 12
Šablonovací systémy – ukázka
{if($form->hasError())}
Chyba...
{endif}
strana 13
Šablonovací systémy – kompilace $script = preg_replace( '|{if\((.+?)\)}|i', '', $script); $script = preg_replace( '|{end[a-z]*}|i', '', $script);
strana 14
Šablonovací systémy – ukázka
hasError()) { ?>
Chyba...
strana 15
Šablonovací systémy – ukázka
{if($form->hasError())}
Chyba...
{endif} hasError()) { ?>
Chyba...
strana 16
Šablonovací systémy – ukázka
{foreach($var as $k => $v)} … |
{endforeach}
strana 17
Šablonovací systémy – ukázka
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 • Active record – objekt obsahuje DB metody jako co dělat se smazanou instancí?
• 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();
třída User je asi mix SQL kódu a logiky modelu…
$user->saveToFile(…); 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);
strana 24
Active record vs Data mapper
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í)
strana 27
MVC vs MVP
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
strana 30
MVC v PHP
strana 31
MVC v JS
strana 32
PHP Frameworky
• ucelené systémy určující způsob práce – knihovny – architektura aplikace
strana 33
PHP frameworky - Google trends
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
práce v týmu
• některé mají CLI – generování modelů a DB migrací – seedování databáze – spouštění testů
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 = last QSA = query string append
[L,QSA]
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/
strana 52
Adminer
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