1. diel - Popis MVC architektúry
Vitajte u prvého dielu seriálu, v ktorom si postupne vytvoríme plne objektový redakčný systém v PHP. Budeme ctiť tzv. MVC architektúru, ktorú si vysvetlíme v dnešnom úvodnom článku. Z nasledujúcich dieloch naprogramujeme web s peknými URL, prihlasovaním, WYSIWYG editorom a kontaktným formulárom. Vytvoríme tiež niekoľko užitočných tried, aby sa ďalšie funkčnosti do webu jednoducho pridávali.
Som vždy prekvapený obrovskú veľkostí zdrojových kódov tretích strán, keď idú veci riešiť jednoducho. Náš kód bude minimalistický a celý systém bude obsahovať niekoľko triedičiek, ktoré budú veľmi krátke.
Seriál počíta so základmi objektovo orientovaného programovania v PHP.
MVC architektúra
MVC je veľmi obľúbený architektonický vzor, ktorý sa uchytil najmä na webe, hoci pôvodne vznikol na desktopoch. Je súčasťou populárnych webových frameworkov, akými sú napr. Zend alebo Nette pre PHP, Ruby On Rail pre Ruby alebo MVC pre ASP .NET. Osobne si bez neho (alebo nejakého podobného princípu) nedokážem predstaviť zložitejšie web.
Princíp
Základnou myšlienkou MVC architektúry je oddelenie logiky od výstupu. Rieši teda problém tzv. "Špagetového kódu", kedy máme v jednom súbore (triede) logické operácie a zároveň renderovanie výstupu. Súbor teda obsahuje databázové dotazy, logiku (napr. PHP operácie) a rôzne pohádzané HTML tagy. Všetko je zamotané do seba ako špagety. Určite ste to niekde videli, požičiam si nejaký zobraz zdroj z prvých PHP tutoriálov na ukážku:
// Tento kód je jak by náš projekt neměl vypadat $vysledek = mysql_query("select * from otazky", $spojeni); if (!mysql_num_rows($vysledek)) echo '<p>Zatím tu žádnou anketu nemáme.</p>'; else { echo '<ul>'; while ($radek = mysql_fetch_array($vysledek)) if ($vybranaanketa == $radek['kodankety']) echo '<li>' . $radek['kodankety'] . ': ' . $radek['otazka'] . ' (aktuálně vybraná)</li>'; else echo '<li><a href="tvorbaanket.php?vybranaanketa=' . $radek['kodankety'] . '">' .$radek['kodankety'] . ': ' .$radek['otazka'] . '</a></li>'; echo '</ul>'; }
Kód sa samozrejme zle udržuje, nieto rozširuje. Je zle highlightovaný, pretože si s ním IDE nevie rady, HTML nie je správne naformátované, strácame sa v jeho stromovej štruktúre. Naším cieľom je, aby zdrojový kód s logikou vyzeral ako zdrojový kód (napr. PHP) a výstup vyzeral ako HTML stránka s čo najmenšou prímesou ďalšieho kódu. Kód výška by sa teda rozdelil do 2 súborov (HTML šablóny a PHP skriptu), ideálne ešte s použitím ďalších tried. Už čoskoro v seriáli uvidíme, ako kód MVC aplikácie vyzerá.
Komponenty
Celá aplikácia je rozdelená na komponenty 3 typov, hovoríme o modeli, View (pohľadoch) a Controller (kontroléry), od toho MVC. Neexistuje žiadna striktná definícia MVC architektúry a tak sa môžete stretnúť s viacerými výklady. Je dosť možné, že to, čo tu popisujem, je architektúra MVP (nebudem rozoberať) alebo dokonca niečo medzi. Čo človek, to názor, čo framework, to iný prístup. Dôležitý je však základný princíp, teda rozdelenie hlavných rolí týchto 3 komponentov.
Komponenty sú samozrejme triedy, ktoré môžu byť odděděné z abstraktných predkov, len view je väčšinou len ako HTML šablóna. Poďme si jednotlivé komponenty najprv popísať.
Model
Model obsahuje logiku a všetko, čo do nej spadá. Môžu to
byť výpočty, databázové dotazy, validácie a podobne. Model vôbec
nevie o výstupe. Jeho funkcia spočíva v prijatí parametrov zvonku a
vydanie dát von. Zdôrazním, že parametre nemyslím URL adresu ani žiadne
iné parametre od užívateľa. Model nevie, odkiaľ dáta v parametroch
prišla a ani ako budú výstupné dáta naformátovaná a
vypísaná.
Budeme programovať bez tzv. ORM (objektovo relačného mapovania), pretože PHP defaultne nič také nemá a hotové riešenia sú zbytočne ťažkopádna. Naviac PHP obsahuje skvelé dátové štruktúry, ktoré s dynamickým typováním nahradí všetko potrebné. Pokiaľ vám skratka ORM nič nehovorí, vôbec to nevadí. Budeme využívať princípu manažérov, logika aplikácie teda bude rozdelená napr. Medzi manažér ManazerUzivatelu, ManazerClanku a tak podobne. Tie obsahujú metódy k výberu potrebných údajov z databázy alebo k ich modifikácii, napr. Metódu k výberu prezývky a informácií o používateľovi pri vypísaní jeho profilu. Inou metódou by sme vyberali odtlačok heslá z databázy, aby sme overili prihlásenie, ďalší by nám vrátila sa články používateľa. V správcovi zároveň nájdeme pomocné metódy k práci s užívateľmi, napr. Ono overenie správnej dĺžky a znakov hesla. Logika sa nemusí týkať len databázy, patrí sem i ostatné veci ako validácia (napr. Overenie správnej dĺžky a formátu zadaného hesla).
Teraz máme predstavu, čo model vykonáva, poďme sa pozrieť na pohľad.
Pohľad
Pohľad (View) sa stará o zobrazenie výstupu užívateľovi.
Najčastejšie sa jedná o phtml šablónu, obsahujúci HTML
stránku a tagy nejakého značkovacieho jazyka, ktorý
umožňuje do šablóny vkladať premenné, prípadne vykonávať iterácie
(cykly) a podmienky. Opäť zachováme maximálnu jednoduchosť a rovnako ako
tomu bolo s ORM, aj tu si vystačíme iba s tým, čo nám ponúka PHP. Pre
šablóny sa často používajú špeciálne značkovacie jazyky (napr. Smarty).
Pre PHP nemá ale príliš veľký zmysel používať značkovací jazyk,
pretože je samo značkovacom jazykom a umožňuje taký štýl zápisu kódu,
aby štruktúra HTML stránky zostala zachovaná.
Pohľadov máme veľa, napr. Pre funkcionalitu s entitou užívateľa: uzivatel_registrace, uzivatel_prihlaseni, uzivatel_profil a podobne. Pohľad uzivatel_profil je ale už spoločný všetkým užívateľom a sú do neho posielané rôzne dáta, vždy podľa toho, koho zrovna zobrazujeme. Tieto dáta sú potom dosadená do HTML elementov šablóny.
Pohľady možno samozrejme vkladať do seba, aby sme sa neopakovali (šablóna s rozložením stránky, šablóna s menu a šablóna článkom).
View nie je len šablóna, ale zobrazovač výstupu. Obsahuje teda minimálne množstvo logiky, ktorá je pre výpis nutná (napr. Kontrola, či si užívateľ vyplnil prezdívku pred jej vypísaním alebo cyklus s komentármi, ktoré sa vypisujú).
View podobne ako Model vôbec nevie, odkiaľ mu dáta prišla, stará sa len o ich zobrazenie užívateľovi.
Kontrolér
Kontrolér je teraz onen chýbajúci prvok, ktorý osvetlí funkčnosť celého
vzoru. Ide o akéhosi prostredníka, s ktorým komunikuje
užívateľ, model aj pohľad. Drží teda celý systém pohromade a komponenty
prepája. Jeho funkciu pochopíme z ukážky životného cyklu
stránky. Opäť existuje veľa rôznych prístupov, najčastejšie má každá
entita jeden kontrolér, máme teda UzivatelKontroler, ClanekKontroler a tak
podobne.
Životný cyklus stránky
Životný cyklus začína používateľ, ktorý zadá do prehliadača adresu webu a parametre, ktorými nám oznámi, ktorú podstránku si želá zobraziť. Budeme chcieť zobraziť detail uzivatele s id 15. Urobme si ukážku URL adresy:
http://www.domena.cz/uzivatel/detail/15
Požiadavka ako prvý zachytí tzv. Smerovač (router). Ten podľa parametrov spozná, ktorý kontrolér voláme. Iste by sme vymysleli mnoho spôsobov, ako meno kontroleru spoznať. Udržujme maximálnu jednoduchosť a vypustí tzv. Manuálna routovanie, názov kontroleru jednoducho uvedieme ako 1. parameter v URL. Tu je teda zavolaný kontrolér UzivatelKontroler, ktorému sú odovzdané 2 parametre "detail" a 15.
Daný kontrolér podľa parametrov spozná, čo sa po ňom chce, teda že má zobraziť detail užívateľa. Zavolá model, ktorý používateľa vyhľadá v databáze a vráti jeho údaje. Ďalej zavolá ďalšiu metódu modelu, ktorá napr. Vypočíta vek používateľa. Tieto údaje si kontrolér ukladá do premenných. Nakoniec vypíše pohľad (view). Názov pohľadu poznáme podľa akcie, ktorú vykonávame. Pohľadu sú odovzdané premenné s príslušnými dátami. Kontrolér teda poslúchol užívateľa, obstaral podľa parametrov dotazu dáta od modelu a odovzdal ich pohľadu.
Pohľad prijme dáta od kontroléra a vloží ich do pripravenej šablóny. Hotová stránka je zobrazená užívateľovi, ktorý často o celej tejto kráse ani netušia
Celú situáciu môžeme znázorniť diagramom:
Získali sme teda oddelenie logiky od výstupu, view sú ako HTML, modely zas v našom skriptovacom jazyku (napr. V PHP). Dosiahli sme prehľadnosti kódu, ktorý je logicky rozčlenený.
MVC architektúra nám uľahčuje aj myslenia pri vývoji projektu. Keď píšeme logiku, patrí do modelu, formátovanie a štýlovanie výstupu riešime v šablóne, to čo užívateľ chce z parametrov zisťujeme v kontroleru. 3 rôzne problémy na 3 rôznych miestach, oddelené tak, aby do seba nezasahovali a nerobili nám vývoj zložitejšie.
Toľko k teórii, nabudúce začneme s inicializáciou systému a smerovačom v lekcii .htaccess, autoloader a všeobecný kontrolér .