IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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 SmerovacKontro­ler.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ť "NazevKontrole­ruKontroler", teda napr. Reťazec "clanek" prevedieme na "ClanekKontroler" a "vypis-uzivatelov" na "VypisUzivate­luKontroler". Na tento prevod si opäť vytvoríme v triede metódu, bude sa volať pomlckyDoVelblou­diNotace ();

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:

Tvoja stránka
localhost/cla­nek/nazev-clanku/dalsi-parametr

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

 

Predchádzajúci článok
.htaccess, autoloader a všeobecný kontrolér
Všetky články v sekcii
Jednoduchý redakčný systém v PHP objektovo (MVC)
Preskočiť článok
(neodporúčame)
Prepojenie kontroleru a pohľadu
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity