3. diel - Smerovač (router)
V minulej lekcii, .htaccess, autoloader a všeobecný kontrolér , sme si nastavili .htaccess, vytvorili index.php a všeobecný kontrolér. Dnes sa budeme venovať smerovaču, teda komponente, ktorá podľa URL adresy nasmeruje požiadavku na správny kontrolér.
Smerovač
Smerovač (anglicky router) dostane URL adresu, ktorú si spracuje a na jej základe zavolá príslušný kontrolér. Opäť je niekoľko spôsobov, ktorými možno smerovač implementovať a opäť som vybral ten najjednoduchší. Princíp smerovače nápadne pripomína princíp kontroleru, toho tiež využijeme, smerovač bude kontrolér.
Smerovač teda pridáme ako kontrolér. V priečinku kontrolery vytvoríme súbor SmerovacKontroler.php a doň rovnomennou triedu, ktorá bude dediť zo všeobecného kontroléru, ktorý sme si urobili minule. Nezabudneme implementovať abstraktné metódu spracuj ().
Smerovač podľa adresy zistí, ktorý kontrolér voláme, vytvorí nám ho a zároveň aj uloží do atribútu $ kontrolér, ktorý triede taktiež pridáme.
<?php class SmerovacKontroler extends Kontroler { protected $kontroler; public function zpracuj($parametry) { } }
Možno je trochu mätúce, že v sebe máme vlastne vložené 2 kontrolery, ale je to tak. Kontrolér SmerovacKontroler berie URL od užívateľa, tú spracuje a podľa nej zavolá príslušný vložený kontrolér (napr. ClanekKontroler). Oba kontrolery budú mať pohľad, smerovačov bude mať šablónu s rozložením stránky (hlavička, menu atď.) A vložený kontrolér bude mať šablónu s obsahom danej stránky (článok, kontaktný formulár, prihlasovacia obrazovka atď.).
Parsovanie URL adresy
Ako prvý si naparsujeme URL adresu a to priamo v PHP. Adresa nám príde ako textový reťazec, bude vyzerať rovnako, ako tá v adresnom riadku. Poďme sa dohodnúť najprv na jej formátu, ktorý bude nasledujúce a ktorý sme už minule naťukli:
http://www.domena.cz/kontroler/parametr2/parametr3
V praxi by vyzerala napríklad takto:
http://www.domena.cz/clanek/nazev-clanku
Hovoríme, že voláme kontrolér ClanekKontroler a odovzdávame mu parameter "nazov-clanku". Kontrolér si už článok vezme od modelu a odovzdá ho pohľadu, ktorý ho vypíše užívateľovi.
Napr. z tejto URL:
http://www.domena.cz/kontroler/parametr2/parametr3
by sme potrebovali získať takého pole:
Array ( [0] => kontroler [1] => parametr2 [2] => parametr3 )
Prídeme triede teda metódu parsujURL ():
private function parsujURL($url) { }
K naparsování url adresy nám PHP poskytuje funkciu parse_url (), ktorá za nás síce neurobí všetku prácu, ale pomôže nám oddeliť časť s protokolom a doménou od časti s parametrami. Funkcia vráti asociatívne pole, časť "/ kontrolér / parameter2 / parameter3" dostaneme pod indexom "path". Pozor si dáme len na "/", ktorým môže táto časť začínať, ak tam je, jednoducho ho odstránime pomocou funkcie LTrim (). Odstránime tiež biele znaky okolo URL (keby za ňu treba niekto napísal medzeru), k tomu slúži PHP funkcia trim ().
$naparsovanaURL = parse_url($url); $naparsovanaURL["path"] = ltrim($naparsovanaURL["path"], "/"); $naparsovanaURL["path"] = trim($naparsovanaURL["path"]);
Teraz nie je nič jednoduchšie, než si výsledný reťazec rozbiť podľa lomítok na pole jednotlivých parametrov:
$rozdelenaCesta = explode("/", $naparsovanaURL["path"]);
Výsledok vrátime a funkcie k parsovanie URL je hotová:
return $rozdelenaCesta;
Volanie vloženého kontroleru
Presuňme sa do metódy spracuj (), ktorá sa nám na začiatku požiadavke zavolá. V argumente $ parametre budeme očakávať polia, kde na 1. indexu bude URL adresa. Tú si naparsujeme pomocou našej metódy:
$naparsovanaURL = $this->parsujURL($parametry[0]);
Zatiaľ nebudeme ošetrovať prípady, kedy je URL zadaná nekompletný alebo neexistujúce.
Získanie názvu triedy
Prvá úloha bude zistiť meno triedy kontroleru. Už vieme, že názov kontroleru je 1. parameter v naparsované URL adrese. Pre URL adresy však platia iné konvencie, než pre názvy tried. Preto nám názov kontroleru príde ako "nazov-kontroléra" a my z neho potrebujeme vytvoriť "NazevKontroleruKontroler", teda napr. Reťazec "clanek" prevedieme na "ClanekKontroler" a "vypis-uzivatelov" na "VypisUzivateluKontroler". Na tento prevod si opäť vytvoríme v triede metódu, bude sa volať pomlckyDoVelbloudiNotace ();
private function pomlckyDoVelbloudiNotace($text) { }
Použijeme PHP funkciu ucwords (), ktorá zväčší začiatočné písmeno všetkých slov vo vete. Funkcia síce nie je UTF-safe, ale to nám tu nevadí. Z parametra si teda najprv urobíme vetu a to jednoducho tak, že pomlčky nahradíme medzerami:
$veta = str_replace('-', ' ', $text);
Následne zväčšíme prvé písmená slov a medzery odstránime:
$veta = ucwords($veta); $veta = str_replace(' ', '', $veta);
To je všetko. Kód by išiel napísať aj do jedného riadku, ale pre potreby tutoriálu som ho rozpísal. Metóda prevedie napr. Reťazec "vypis-uzivatelov" na VypisUzivatelu. Výsledok navrátime:
return $veta;
Vráťme sa do metódy spracuj () a zistime si názov triedy kontroleru pomocou našej novej metódy:
$tridaKontroleru = $this->pomlckyDoVelbloudiNotace(array_shift($naparsovanaURL)) . 'Kontroler';
Pomocou array_shift () sme získali 1. parameter z naparsované URL a zároveň ho z tohto poľa aj odstránili, už ho tam totiž nebudeme potrebovať.
Názov triedy kontroleru si pre testovacie účely len Výpisy:
echo($tridaKontroleru);
Rovnako tak si výpisy aj zvyšok poľa z URL adresy:
echo('<br />'); print_r($naparsovanaURL);
Volanie smerovača
Presuňme sa do index.php a vytvorme si tu smerovač. Necháme ho spracovať URL adresu, ktorú v PHP nájdeme v superglobálním poli $ _SERVER pod kľúčom REQUEST_URI. Hodnotu ešte musíme vložiť do poľa, pretože to metóda spracuj () očakáva:
$smerovac = new SmerovacKontroler(); $smerovac->zpracuj(array($_SERVER['REQUEST_URI']));
Vďaka Autoloader zminula sa nám trieda SmerovacKontroler sama načíta. Celú mágiu si vyskúšame, zadáme nasledujúce URL:
localhost/clanek/nazev-clanku/dalsi-parametr
A mali by sme dosiahnuť nasledujúceho výsledku:
Smerovač nám teda funguje, z URL adresy nám zistil názov kontroléra a polia parametrov. Pre dnešok toho už bolo dosť. Nabudúce, v lekcii Prepojenie kontroleru a pohľadu , si systém sprevádzkujeme.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 3605x (4.4 kB)
Aplikácia je vrátane zdrojových kódov v jazyku PHP