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: 1function find_controller(array $path) { 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:
1
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])){ 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: 7 let
|
Toto vlákno je staré, již dlouho do něj nikdo nepřispíval.
Informace a odkazy zde uváděné už nemusejí být aktuální. Nechcete-li řešit zde uvedenou konkrétní otázku, založte si vlastní vlákno, nepište do tohoto. Vložíte-li sem nyní příspěvek, upoutáte pozornost mnoha lidí a někteří z nich si jen kvůli vám přečtou i všechny předcházející příspěvky. Předpokládáte-li, že váš text skutečně bude hodnotný, stiskněte následující tlačítko:
Běda vám, jestli to bude blábol.
0