Adresy ve statickém routeru
- d@rkWolf
- Člen | 167
Zdravím, potřeboval bych poradit, je možné nějak nastavit statický router, abych měl adresy takto?
doména/news – newsPresenter:default
doména/news/120-my-news-article – newsPresenter:detail
Nedaří se mi to nastavit, asi to z toho návodu špatně chápu…myslel jsem, že to bude fungovat takto:
<?php
$router->withModule('Front')
->addRoute('news[/<id>-<action>]', [
'presenter' => 'News',
'action' => 'default',
'id' => null
])
->addRoute('[<locale=en en|cs|de>/]<presenter>[/<action>[/<id>]]', [
'presenter' => 'Homepage',
'action' => 'default',
'id' => null,
]);
return $router;
?>
ale funguje pouze default(domena/news), při zadání doména/news/120-my-news-article mě to posílá na newsPresenter:myNewsArticle a ID 120 – chtěl jsem, aby mě to prostě při zadání formátu news/id-string poslalo na akci Detail a tam bych si vyhledal to poslané ID v DB a buď vrátil obsah do šablony, nebo vrátil Error(404).
Navíc k tomu potřebuju nějak nasměrovat původní staré adresy(domena/news?detail=170).
Editoval d@rkWolf (23. 4. 2020 12:03)
- Kamil Valenta
- Člen | 815
Ty ale tady:
->addRoute('news[/<id>-<action>]', [
'presenter' => 'News',
'action' => 'default',
'id' => null
])
říkáš, aby zachytával action (pozor, to v poli jsou jen výchozí
hodnoty).
Pokud nechceš actionu zachytávat, tak ji v routě neuváděj a pak se vezme
ta výchozí.
->addRoute('news[/<id>-<slug>]', [
'presenter' => 'News',
'action' => 'default',
'id' => null
])
- d@rkWolf
- Člen | 167
Aha, to já nad tím zas uvažuju špatně, ach jo. Já právě chtěl to Action využít jako aby to nějak dostalo na renderDetail toho daného presenteru, protože když sem tam nechal jen id, tak mi to dávalo jakýkoliv text za tím id z adresy pryč.
Když tam dám slug, tak to adresu nechá zdá se a nevyhodí 404, takže to mám poslat takhle a teď v actionDefault(nebo někde dřív? ale v konstruktoru mi getParameter(‚id i slug‘) vrací null) to chytit, ověřit v DB a buď dát ->error(404), nebo hodit data do šablony a nastavit view na renderDetail? Je to správná úvaha, nebo postupuju blbě?
Já sem byl zvyklej tohle dělat bez nette jinak, adresy sem skládal ručně, přišlo mi to naprosto logický(vytáhnu z DB seznam aktualit, vypíšu v cyklu a do detail href linku přeberu aktuální adresu a přidám /item[id] . ‚-‘ . item[url/slug/whatever] a to obousměrný routování se mi furt nějak nedaří podchytit…
- Kamil Valenta
- Člen | 815
Bylo by i dobré dát tomu <id> pattern, že to může být jen číslo (pokud tomu tak je), nebo alespoň že nemůže obsahovat pomlčku, aby bylo zřejmé co je id a co slug.
Také bych si udělal FilterIN metodu, která mi hned ověří, zda je ID
platné.
Nedává mi moc smysl napřed něco validně routou chytnout a pak vykopnout
404 někde v presenteru. Nehledě na to, že nějaká další routa to mohla
matchnout a vůbec to ve 404 končit nemuselo…
- d@rkWolf
- Člen | 167
Myslíš takhle: [/<id \d+>] ?
Jo, ID je autoincrement z tabulky novinek.
Vypadlo mi z té routy ->addRoute(‚[<locale=en en|cs|de>/]news[/<id>-<action>]‘, [… , musí tam být i jazyk, protože novinky jsou uložené s jazykem(nejsou společné, muselo by se to zároveň hledat i s jazykem), není možné, aby se v němčině otevřela anglická novinka(např. domena.cz/de/155-hello-world) když se použije existující ID s anglickou novinkou, v tu chvíli tam prostě musím mít 404, protože v němčině nic takového není.
Netuším, jak to v tom routeru udělat, v presenteru bych si prostě vzal do DB dotazu $this->translator->getLocale nebo jak to je, router už by vyřešil, že může nabývat jen těch 3 zadaných hodnot, výchozí en, nebo cs/de a hledal novinku podle toho jazyka.
Zkusil jsem něco takového:
<?php
->addRoute('[<locale=en en|cs>/]news/<id \d+>-<slug>', [
'presenter' => 'News',
'action' => 'detail',
'id' => null,
'slug' => [
Route::FILTER_IN => function ($slug) use ($db) {
return $db->query('SELECT * FROM news WHERE slug = ?', $slug)->fetch();
},
Route::FILTER_OUT => function ($slug) use ($db) {
return $slug['slug'];
},
],
])
?>
to mi sice otevře dobře Presenter News-akci Detail a ani to nijak nezprzní
adresu(zůstane tam domena/news/155-hello-world), ale nevím, jak do toho dotazu
dostat jazyk a nefunguje mi to na opačnou stranu, ve výpisu mi novinek když
dám do odkazu:
<a n:href=„News:Detail $news->id . ‚-‘ .
$news->slug“>more</a>
generuje to adresy nějak takto:
domena/news/detail?slug=155-hello-world
- Kamil Valenta
- Člen | 815
Myslím, že už se blížíš do cíle.
Nefiltruj jen slug, filtruj všechny parametry dohromady, protože tě jde
o konkrétní kombinace:
->addRoute('[<locale=en en|cs>/]news/<id \d+>-<slug>', [
'presenter' => 'News',
'action' => 'detail',
'id' => null,
NULL => [
Route::FILTER_IN => function ($params) use ($db) {
return $db->query('SELECT * FROM news WHERE locale = ? AND slug = ?', [$params['locale'], $params['slug']])->fetch();
},
],
])
EDIT:
také je dobré si zacachovat slugy dle mutace, obzvláště pak kvůli OUT
odkazům, aby každé generování odkazu nesahalo do DB…
Editoval kamil_v (27. 4. 2020 14:18)
- d@rkWolf
- Člen | 167
Tak nakonec mi vyšlo tohle:
<?php
$router->withModule('Front')
->addRoute('[<locale=en en|cs>/]news/<id \d+>-<slug>', [
'presenter' => 'News',
'action' => 'detail',
'id' => null,
null => [
Route::FILTER_IN => function ($params) use ($db) {
$data = $db->query('SELECT id, slug, lang FROM news WHERE lang = ? AND slug = ?', $params['locale'], $params['slug'])->fetch();
if ($data) {
return $params;
}
return null;
},
Route::FILTER_OUT => function ($params) use ($db) {
if (!isset($params['id']) || $params['id'] === null) {
return $params;
}
$data = $db->query('SELECT id, slug, lang FROM news WHERE lang = ? AND id = ?', $params['locale'], $params['id'])->fetch();
if (!$data) {
return null;
}
return [
'id' => $data['id'],
'slug' => $data['slug'],
];
},
],
])
->addRoute('[<locale=en en|cs>/]<presenter>[/<action>[/<id>]]', [
'presenter' => 'Homepage',
'action' => 'default',
'id' => null,
]);
return $router;
?>
Jenže je to naprosto neefektivní, na vytvoření každého detail linku je v přehledu potřeba dotaz do DB, naprosto zbytečnej, protože adresu toho linku znám z dat, který si vytahuju kvůli vypsání těch novinek, takže mi vyjde daleko líp, když prostě vyhodím n:href a ten link sestavím přímo, což sem dělal minulých 10 let bez Nette a nijak mě to neomezovalo.
Navíc díky globálnímu filtru nejde vrátit objekt Selection z DB(což šlo, když se použil ten FILTER_IN pro ‚slug‘ ⇒ []), musí se vrátit pole $params pro metodu Match, takže do Detailu v NewsPresenteru dostanu akorát slug(string) a musím dělat znovu dotaz do DB, abych se dostal k datům o tom detailu, které chci vypsat.
Asi mi někde uniká přínos toho obousměrného routování?
Teď nezbývá, než to nějak cachovat a to zas nevím jak…navíc to znamená tu cache taky při každé editaci v adminu nějak mazat, další zbytečný kód navíc.
Nemluvě o tom, že tohle jsou jen novinky, do toho Routeru ještě přijdou další speciální stránky, který budou potřebovat něco podobného, ale s jinými(mnohem více) parametry kvůli formulářovému filtrování, takže se ten router rozroste na pěknou bestialitu. Furt mám dojem, že by vyšlo daleko líp, kdybych to směroval napevno a otázku co přišlo řešil s DB až v Presenteru.
Editoval d@rkWolf (28. 4. 2020 0:50)
- Kamil Valenta
- Člen | 815
d@rkWolf napsal(a):
Jenže je to naprosto neefektivní, na vytvoření každého detail linku je v přehledu potřeba dotaz do DB, naprosto zbytečnej,
Na to jsem ale upozorňoval předem, můžeš si validní slugy v rámci mutace a modulu zachachovat.
protože adresu toho linku znám z dat, který si vytahuju kvůli vypsání těch novinek
Můžeš si to ověření z FILTER OUT odebrat, IMHO není špatné, že router nevytvoří nevalidní odkaz, ale pokud se chceš spoléhat na to, že do n:hrefu nic špatného nepříjde, můžeš.
Navíc díky globálnímu filtru nejde vrátit objekt Selection z DB(což šlo, když se použil ten FILTER_IN pro ‚slug‘ ⇒ []), musí se vrátit pole $params pro metodu Match, takže do Detailu v NewsPresenteru dostanu akorát slug(string) a musím dělat znovu dotaz do DB, abych se dostal k datům o tom detailu, které chci vypsat.
Vrať si v params vše co potřebuješ.
Teď nezbývá, než to nějak cachovat a to zas nevím jak…
https://doc.nette.org/cs/caching
navíc to znamená tu cache taky při každé editaci v adminu nějak mazat,
Např. $cache->clean([Cache::TAGS ⇒ [„router“]]); to není zas taková hrůza.
další zbytečný kód navíc.
Ty zbytečné kódy navíc dělají tvou aplikace lepší. Vždy můžeš frameworky nepoužívat a napsat si něco na 5 řádků, možná neúplné, děravé, ale krátké.
Nemluvě o tom, že tohle jsou jen novinky, do toho Routeru ještě přijdou další speciální stránky, který budou potřebovat něco podobného, ale s jinými(mnohem více) parametry kvůli formulářovému filtrování, takže se ten router rozroste na pěknou bestialitu.
Každý modul může mít svůj vlastní router a řešit jen sám sebe. Je to přehledné a efektivní.
Furt mám dojem, že by vyšlo daleko líp, kdybych to směroval napevno a otázku co přišlo řešil s DB až v Presenteru.
Ten dojem není úplně dobrý. Co udělá presenter, když zjistí, že pro
daný slug nemá žádný záznam?
Spíš doporučuju projít si dokumentaci, zjistit co všechno a jak se dá
využít a pak teprve dělat závěry.
Editoval kamil_v (28. 4. 2020 9:03)
- d@rkWolf
- Člen | 167
No problém s tím cachováním je, že sem poněkud nepřesvědčený o efektivitě. Resp. cache file s 20ti slugy je asi fajn, ale co když pak ten cache soubor bude mít půl mega? To se mi zrovna u novinek asi nestane, ale principielně… Načítám a procházím půl mega zbytečných cache dat nějakým cyklem, i když už jsem je měl v přehledu vybrané-třeba v 10 ks podle stránkování přímo.
Myslíš dát ten objekt jako položku pole v Params? Jak se k tomu v tom Presenteru dostanu? Když dumpnu $slug z:
<?php
public function renderDetail($slug): void
?>
vypadne na mě jen string slugu(přitom v poli Params je -
id ⇒ „166“ (3)
slug ⇒ „hello-world“ (15) nebo ten selection dát sem do toho
slugu?
presenter ⇒ „News“ (4)
action ⇒ „detail“ (6)
locale ⇒ „en“ (2)
item ⇒ object Selection ?
a ten formát pole Params musím dodržet, jinak to řve ten TypeError viz. výše.
Mno s tím zbytečným kódem…já mám problém s tím, kdy se zbytečný
kód = neefektivní, tak jako s těma adresama, teď sem si zkusil nahodit
formát výpisu novinek, odkaz pro detail musí být v nadpisu,
v hlavičkovém obrázku novinky a ještě v tlačítku Více na konci, v tu
chvíli mám na 10 novinek 32 dotazů do DB. To je o 30 dotazů víc, než
si můžu dovolit. A popravdě, nevím, o kolik je 30× procházení cache
souboru se slugy efektivnější.
Nakonec jsem to aspoň prozatím udělal takto, zdá se, že se tak dá uložit
ten vygenerovaný link: {capture $link}{plink :Front:News:Detail id ⇒
$news->id}{/capture} – todle sou typický věci, který by byly potřeba
v dokumentaci, v Quickstartu, všude, místo aby se to muselo složitě
hledat, jak sakra uložit sestavenej odkaz abych ho nemusel sestavovat
několikrát pro každou položku výpisu
Mám web rozdělený jen na 2 moduly, Front a Admin, jednu chvíli jsem testoval věc, která byla rozdělaná na moduly stylem Modul stránky, Modul novinky …atd. a bylo to děsně pomalé, nicméně možná to bylo použitou Doctrine, těžko říct, neměl jsem tolik času, abych ju z tama komplet vykopal a zkusil to bez ní. Dělám webovky, nemůžu si dovolit, aby to bylo pomalé a návštěvník odcházel a google to degradoval ve výsledcích.
Mno když presenter slug nenajde, dám tam $this->Error a nazdar.
Ještě jsem narazil na problém se starýma adresama, chtěl jsem využít ONE_WAY, když už sem to routování těch novinek nějak zprovoznil, ale když ji umístím takto:
<?php
$router->withModule('Front')
->addRoute('[<locale=en en|cs>/]news ? detail=<id \d+>', 'News:detail', $router::ONE_WAY)
->addRoute('[<locale=en en|cs>/]news/<id \d+>-<slug>', [
...
?>
Staré adresy byly takto: /news?detail=170, to mi ta ONE_WAY routa správně přesměruje na novou adresu /news/170-nejaky-slug.
Problém je, že mi to chytá i adresu /news a přesměrovává ji to na
/news/detail, jak tomu zabránit?
Když tu routu zapoznámkuju, staré adresy nepozná, ale /news zase funguje
správně na News:default.
Editoval d@rkWolf (29. 4. 2020 14:07)
- Kamil Valenta
- Člen | 815
d@rkWolf napsal(a):
No problém s tím cachováním je, že sem poněkud nepřesvědčený o efektivitě.
Máš asi jen 2 možnosti. Buď to nepoužiješ, protože máš obavy, nebo
to vyzkoušíš.
Cache na slugy používám na eshopech s tisícovkama záznamů a je to
naprosto rychlé.
Myslíš dát ten objekt jako položku pole v Params?
Nevím, co je to „ten objekt“, psal si myslím, že si pak v Presenteru musíš podle slugu dotahovat id, což nemusíš, může ti ho předat rovnou router. Nevím, co všechno ještě dál potřebuješ.
Mno s tím zbytečným kódem…já mám problém s tím, kdy se zbytečný kód = neefektivní, tak jako s těma adresama, > Mám web rozdělený jen na 2 moduly, Front a Admin, jednu chvíli jsem testoval věc, která byla rozdělaná na moduly stylem Modul stránky, Modul novinky …atd. a bylo to děsně pomalé
Chápu, ale není vůbec jisté, že tu neefektivnost vnáší framework. Já to takto používám a pomalé to není. Rout mám desítky.
Mno když presenter slug nenajde, dám tam $this->Error a nazdar.
A co kdyby ale jiná, následující routa, pro ten slug měla regulérní obsah? Tak se k němu nedostaneš, protože to mylně matchneš routou, která na to sahat neměla, a vyhodíš error.
Problém je, že mi to chytá i adresu /news a přesměrovává ji to na /news/detail, jak tomu zabránit?
Předřaď tomu specifickou routu, která matchne /news.
Editoval kamil_v (29. 4. 2020 15:00)
- d@rkWolf
- Člen | 167
Myslel jsem tohle:
<?php
return $db->query('SELECT * FROM news WHERE locale = ? AND slug = ?', [$params['locale'], $params['slug']])->fetch();
?>
když jsem to použil tady v tomhle původním pokusu :https://forum.nette.org/…ckem-routeru#…
tak šel vrátit celý ten Selection z DB a celý ten objekt mi přišel do toho presenteru do renderDetail, zatímco když použiju ten globální filtr, musím vracet pole – tahle cos psal nefunguje :https://forum.nette.org/…ckem-routeru#… , protože to řve, že do funkce Match posílám object Selection místo pole $params. Takže musím sestavit pole $params a z toho mi pak do renderDetail($item) přijde jen string slugu, ani tam není celý to pole, takže musím v tom renderDetail dělat znovu ten samej výběr z DB, abych mohl ten detail vypsat
Mno s těma adresama novinek je to neefektivní 100%, prostě vybírat a cachovat/hledat v cache něco, co sem hned předtím stejně vybral…nevím, jakej má na Nette přesně vliv produkční/vývojový režim, ale když srovnám třeba systém, co máme s Doctrine a starým nette 2.0beta až 2.3, tak to je peklo na zemi, tam není stránka, která by měla v tracy execution pod 300–400ms(častější je tak 500–800ms) a nemá na to vliv ani, když se nic z DB netahá(v tom systému byly krásný věci jako zobrazení 30 objednávek v adminu v Grido provádělo kolem 900 dotazů do DB a trvalo to pár minut). To co dělám teď má jen Nette Database(protože další zbytečnej overhead nechci) a prázdný stránky, který ani nešahají do DB, maj jen statickej obsah mi naskakují v tracy kolem 40–50ms a co tu mám hozený nedávno dělaný web, kterej teda do DB šahá, front page dělá 4 dotazy, mám v tom přilinkovanou ručně staženou Tracy(s přidaným modifikovaným panelem na jednoduché zobrazení prováděných dotazů co sem si vypůjčil z Dibi) a tam je execution stránky kolem 15ms, takže zapojení nette znamená cca 3× pomalejší execution, 3× tolik paměti(cca 2.9MB vs. 0,9 – což bude asi těma 274 included files, zatímco v mým starým systému ukazuje Tracy 25)
když se dá $this->error, tak to jde automaticky na 404 a nic dalšího už router zkoušet nebude? mě takhle systémy nefungují, jelikož sem si dycky adresy sestavoval přesně sám, tak nepřipadalo v úvahu, aby se dala adresa špatně interpretovat, všechny byly naprosto jednoznačný, právě proto mám tady s tím propadáváním routama problémy, nebylo možný uživatelsky vložit adresu, která by dávala smysl pro víc php šablon.
To je přesně co sem nechtěl, doufal jsem, že všechno mimo detaily z DB budu chytat až na tuhle výchozí routu…
<?php
->addRoute('[<locale=en en|cs>/]<presenter>[/<action>[/<id>]]', [
'presenter' => 'Homepage',
'action' => 'default',
'id' => null,
]);
?>
A bez té jednosměrky se zdálo, že mi to tak bude fungovat. Myslel jsem,
jeslti se do té jednosměrky nedá nějak zapsat, že to:
? detail=<id \d+> je povinné, aby to tu základní /news nechytalo,
v dokumentaci k routování sem ale nic nenašel, což ale většinou moc
neznamená
- Kamil Valenta
- Člen | 815
d@rkWolf napsal(a):
tak šel vrátit celý ten Selection z DB a celý ten objekt mi přišel do toho presenteru do renderDetail, zatímco když použiju ten globální filtr, musím vracet pole – tahle cos psal nefunguje
Jasně, já to jen kopíroval z předchozího, netestuju, byl to jen
námět.
Každopádně si myslím, že i v params by měla jít vrátit selectiona,
zkoušel jsi třeba něco takového?
->addRoute('[<locale=en en|cs>/]news/<id \d+>-<slug>', [
'presenter' => 'News',
'action' => 'detail',
'id' => null,
null => [
Route::FILTER_IN => function ($params) use ($db) {
$data = $db->query('SELECT id, slug, lang FROM news WHERE lang = ? AND slug = ?', $params['locale'], $params['slug'])->fetch();
if ($data) {
return $params['data'] = $data;
}
return null;
},
takže musím v tom renderDetail dělat znovu ten samej výběr z DB, abych mohl ten detail vypsat
Normálně nemusíš, takže něco nemáš dobře.
Mno s těma adresama novinek je to neefektivní 100%, prostě vybírat a cachovat/hledat v cache něco, co sem hned předtím stejně vybral…
Efektivní to je, protože když to máš v cache, nemusí router vůbec do DB sahat. Router to nasměruje na patřičný presenter, předá ID novinky a jedním dotazem vytáhneš detail. Jednodušší a efektivnější to snad ani nemůže být.
To je přesně co sem nechtěl, doufal jsem, že všechno mimo detaily z DB budu chytat až na tuhle výchozí routu…
<?php ->addRoute('[<locale=en en|cs>/]<presenter>[/<action>[/<id>]]', [ 'presenter' => 'Homepage', 'action' => 'default', 'id' => null, ]); ?>
Už se v tom neoritentuju a špatně se to vyhodnocuje, když jsou tady jen útržky rout. U rout záleží na pořadí, proto výňatky z kontextu mohou být klamné. Prostě si seřaď routy od konkrétních po obecné, dej si pozor kde máš jaké parametry volitelné a musí to šlapat.
- d@rkWolf
- Člen | 167
Jo, je v tom bordel, takhle to vypadá celý…je to odporná zprasenost, abych byl přesnej…
<?php
$router = new RouteList;
$router->addRoute('index.php', 'Front:Homepage:Default', Route::ONE_WAY);
$router->withModule('Admin')
->addRoute('admin/<presenter>[/<action>][/<id>]', 'Dashboard:default');
$router->withModule('Front')
->addRoute('[<locale=en en|cs>/]news?detail=<id \d+>', [
'presenter' => 'News',
'action' => 'detail',
'id' => null,
null => [
Route::FILTER_IN => function ($params) use ($db) {
if ($params['id'] === null) {
return null;
}
$data = $db->query('SELECT id, slug, lang FROM news WHERE id = ?', $params['id'])->fetch();
$params['data'] = $data;
return $params;
},
],
], $router::ONE_WAY)
->addRoute('[<locale=en en|cs>/]news/<id \d+>-<slug>', [
'presenter' => 'News',
'action' => 'detail',
'id' => null,
null => [
Route::FILTER_IN => function (array $params) use ($db) {
$data = $db->query('SELECT * FROM news WHERE lang = ? AND slug = ?', $params['locale'], $params['slug'])->fetch();
if ($data) {
$params['data'] = $data;
return $params;
}
return null;
},
Route::FILTER_OUT => function (array $params) use ($db) {
if (!isset($params['id']) || $params['id'] === null) {
return $params;
}
$data = $db->query('SELECT id, slug, lang FROM news WHERE lang = ? AND id = ?', $params['locale'], $params['id'])->fetch();
if (!$data) {
return null;
}
return [
'locale' => $data['lang'],
'id' => $data['id'],
'slug' => $data['slug'],
];
},
],
])
->addRoute('[<locale=en en|cs>/]<presenter>[/<action>[/<id>]]', [
'presenter' => 'Homepage',
'action' => 'default',
'id' => null,
]);
return $router;
?>
Pro ten ONE_WAY sem musel taky přidat filtr, protože sem nepřišel na jinej způsob, než to dycky vrátit do Presenteru a v actionDefault zjistit, jestli je to ve správném jazyce a pokud ne, poslat to na $this->Error, stejně tak v případě, že by tam třeba někdo zkoušel neexistující ID bůh ví proč, zjistím, že mám ID a nemám data a můžu to zas poslat na 404.
Ještě jsem k tomu musel přeprasit ErrorPresenter a vnutit mu ručně „Front“ module když nastane situace „No route“ a modul není definovanej-původně sem to chápal tak, že to automaticky půjde na modul, co nemá definovaný název v routě(narozdíl od /admin/…), ale nikoliv, takže No route mi padalo do neexistujícího Error4xx presenteru, protože ty mám jen v modulech-jeden ve Front a jeden v Admin modulu. Mimo je jen hlavní ErrorPresenter, protože ten může být jen jeden.
Netuším, možná může nastat situace, kdy je takový řešení na nic, ale momentálně mě nenapadá a já potřebuju mít 4xx stránku s front-endovým menu, patičkou atd…(pro Admin zas potřebuju 4xx co bude zobrazená uvnitř administrace)…
Todle mě stálo několik dní času který nemám. Než sem to skopíroval, musel sem smazat dobře takových 1000 zapoznámkovaných řádek nefunkčních pokusů a stejně počítám, že přijdu na nějaký adresy co nefungují a které sem nevyzkoušel.
- Kamil Valenta
- Člen | 815
Moc nerozumím myšlence, že 3. a 4. routa má povinný parametr id, který je v defaultu null.
Jinak jsi neuvedl, v jakém je to stavu? Funguje to již dle představ?
Chápu, že Ti to asi trvalo déle, ale tak je to přece se vším, s čím člověk začíná a dělá to třeba „poprvé“. Framework opravdu nemůže za to, že jsi měl zapoznámkovaných 1000 řádků nefunkčních pokusů. Uvidíš, že další routy už budeš psát na první dobrou.
- d@rkWolf
- Člen | 167
Myslíš tohle: ‚id‘ ⇒ null ??
Mno ID by mělo bejt povinný, páč je to myšlený jen na detaily, já myslel, že to tam musí bejt takhle uvedený…jestli ne, tak to asi můžu smazat?
Mno co sem zatím zkusil, tak vypadá, že funguje, ale těžko říct, těch variací je spousta, nevím, jestli mě napadly všechny.
Ještě potřebuju druhou podobnou routu, na jinej presenter, ve stejném formátu detailu(id-slug), jenže v adrese bude potřeba ještě nějak rozlišovat tuším 5 nebo 6 formulářem odesílaných filtrovacích parametrů.