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 |
#5 · Zasláno: 1. 3. 2018, 18:06:06
Aha, chápu, takže až controller pro kategorii rozhodne zda definitivně vyhodit chybu, díky.
|
||
Časová prodleva: 6 let
|
0