Autor Zpráva
Hitman
Profil
Dobrý podvečer,

snažím se proniknout do MVC architektury podle seriálu na itnetwork, ale hned na začátku mi není jasná jedna věc. Mám udělaný router, který mi z url zjistí první část a podle toho volám příslušný kontroler. Čili url:

jakpsatweb.cz/kontakt/pepa

Mi zajistí zavolání kontroleru Kontakt a předá mu ke zpracování parametr pepa. Já ale potřebuji udělat klasické kategorie jakpsatweb.cz/nejaka-kategorie/clanek-z-dane-kategorie

A samozdřejmě je nesmysl mít názvy kontrolerů podle kategorií, ty budu mít v db. Moje otázka:

Je potřeba to udělat úplně na jiném principu, nebo si mám udělat kontroler Kategorie, který bude standardně na url jakpsatweb.cz/kategorie/nazev-kategorie/ a v htaccess potom "/kategorie/" odstraním?

Url článku by potom byla originál: jakpsatweb.cz/kategorie/nazev-kategorie/nazev-clanku a podstrčená jakpsatweb.cz/nazev-kategorie/nazev-clanku.

Čili by se v htaccess napsalo něco ve stylu pokud /nazev-kategorie/ neexistuje, hledej to v "kategorie/nazev-kategorie"...?
juriad
Profil
Nemusíš řešit žádné .htaccess.
V routeru máš nějakou logiku, která seká URL a nakonec vrátí název controlleru a seznam parametrů.
V tomto případě název controlleru bude natvrdo KategorieController a z celé adresy se stanou parametry.

Samozrejmě, ze pokud chces mít víc controllerů - přihlášení, administrace, tak napřed zkusíš, zda URL neodpovidá jednomu z nich a ten kategoriový necháš až úplně na konci.


Například si můžeš napsat funkci:
function find_controller(array $path) {
  # cesta je prázdná
  if (count($path) == 0) {
    return ["controller" => "DefaultController", "params" => [], "redirect" => false];
  }
  
  # jiný než kategoriový controller
  $controller = $path[0] . "Controller";
  if (controller_exists($controller)) {
    # pokud by náhodou byl zmíněný jeden z vyjmenovaných controllerů, potřebujeme uživatele přesměrovat kvůli zabrání duplicit
    $redirect = $controller == "DefaultController" || $controller == "KategorieController";
    return ["controller" => $controler, "params" => array_slice($path, 1), "redirect" => $redirect];
  }
  
  # kategoriový controller
  return ["controller" => "KategorieController", "params" => $path, "redirect" => false];
}

Pak stačí implementovat funkci controller_exists($controller), která zjistí, zda controller daného jména existuje.
Samozřejmě, že toto ti neumožní mít kategorii pojmenovanou "Default" ani "Kategorie" ani nic jiného, co by se shodovalo se jménem controlleru.
Hitman
Profil
Díky za nasměrování, mám to napsané trochu jinak:

 
public function zpracuj($parametry)
        {
            
        
        
            $naparsovanaURL = $this->parsujURL($parametry[0]);
            
            if (empty($naparsovanaURL[0])){ //pokud první parametr v url chybí, přesměrujeme na uvod
                    $this->presmeruj('clanek/uvod');
            } 
        
            $tridaKontroleru = $this->pomlckyDoVelbloudiNotace(array_shift($naparsovanaURL)) . 'Kontroler';
            
            if (file_exists('kontrolery/' . $tridaKontroleru . '.php')){
                $this->kontroler = new $tridaKontroleru;
            }
            else {
                                TADY JE POTŘEBA PŘIDAT PODMÍNKA PRO KONTROLU ZDA KATEGORIE EXISTUJE
                $this->presmeruj('chyba');
            }
                        
            
            
        }
        

Navrhoval bych v místě které jsem označi přidat ještě podmínku zda kategorie existuje a pokud ne, vyhodí chybu.


A vůbec netuším jak statickou třídu použít v podmínce.

 If(Db::dotazJeden('SELECT `clanky_id`, `titulek`, `obsah`, `url`, `popisek`, `klicova_slova` FROM `clanky` WHERE `url` = ? ', array($naparsovanaURL[0])){
   
   }
)
juriad_
Profil *
Tam zadna podminka nepatri. Proste reknes, ze jde o kategoriovy controller. A ten pozdeji overi existenci kategorie a pripadne vyhodi chybu 404.)


Router není zodpovědný za kontrolu názvu kategorie, to má dělat až controller. Router jen rozhoduje, který controller s jakými parametry zavolat, což v tomto případě umí.
Hitman
Profil
Aha, chápu, takže až controller pro kategorii rozhodne zda definitivně vyhodit chybu, díky.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0