Předání dat z RouterFactory do Presenteru
- crassus
- Backer | 78
Ahoj, chtěl bych se vás zeptat, jak nejlépe můžu poslat data z RouterFactory do Presenteru?
Chci nejdřív vytáhnout všechny produkty z db, abych mohl vyrobit URL adresy. Takže v RouterFactory.php volám:
public static function createRouter(Product $product)
{
$products = $product->getProducts();
}
Jak mám potom vytáhnout tyto produkty v presenteru, aniž bych musel znovu pokládat SQL dotaz do db?
Díky moc :)
- duke
- Člen | 650
crassus napsal:
Jak mám potom vytáhnout tyto produkty v presenteru, aniž bych musel znovu pokládat SQL dotaz do db?
Např. tak, že tvá služba Product, která je poskytuje, si je bude pamatovat a při příštím volání getProducts() jen vrátí, co si před tím zapamatovala.
Metodě getProducts pak můžeš přidat parametr $forceReload s defaultní hodnotou false, kdybys přeci jen potřeboval produkty znovu načíst přímo z db.
- crassus
- Backer | 78
duke napsal(a):
crassus napsal:
Jak mám potom vytáhnout tyto produkty v presenteru, aniž bych musel znovu pokládat SQL dotaz do db?
Např. tak, že tvá služba Product, která je poskytuje, si je bude pamatovat a při příštím volání getProducts() jen vrátí, co si před tím zapamatovala.
Metodě getProducts pak můžeš přidat parametr $forceReload s defaultní hodnotou false, kdybys přeci jen potřeboval produkty znovu načíst přímo z db.
Aha, jasně, protože všude se vkládá jenom jedna jediná instance třídy Product. Tak super! Díky :)
- David Matějka
- Moderator | 6445
ahoj, kolik mas produktu? protoze tohle rozhodne neni optimalni reseni, jak vytvaret routy. mel bys jit cestou vlastniho routeru nebo filtru v Route tride
- crassus
- Backer | 78
David Matějka napsal(a):
ahoj, kolik mas produktu? protoze tohle rozhodne neni optimalni reseni, jak vytvaret routy. mel bys jit cestou vlastniho routeru nebo filtru v Route tride
Ahoj, diky za dotaz. Zrovna jsem totiz zacal resit, jak mam v metode createRouter() vytahnout persistentni parametr $lang, ktery potrebuji k vytazeni produktu ve spravne jazykove mutaci.
Produktu mam 100 maximalne, ale 1 produkt = JOIN na 10 tabulek.
Da se nejak vytahnout perzistentni parametr v metode createRouter()?
Co to znamena cesta vlastniho routeru? V cem by byl vlastni router lepsi/efektivnejsi?
Filtrem by se to nejspis dalo resit taky, protoze mi kazda URL produktu konci s „-id“, tzn. /nazev-produktu-14. Proto bych mohl filtrovat jenom URLs, ktere maji na konci „-id“. Ale takhle mi to zase udela validni routy z x rout, ktere validni nejsou.
- David Matějka
- Moderator | 6445
Da se nejak vytahnout perzistentni parametr
ne, jelikoz k routovani dochazi logicky pred vytvorenim presenteru. ale predpokladam, ze ten lang mas stejne v url, ne?
pokud ti u rout nehrozi, ze budou kolizni, tak je rozhodne lepsi udelat obecnou routu, neco jako
new Route('<lang>/<slug>-<id \d+>', 'ProductDetail:default')
a s produktem pracovat az v presenteru
pokud hrozi, ze by kolidovala s jinou, muzes si dat do filtru neco jako:
new Route('<lang>/<slug>-<id \d+>', [
'presenter' => 'ProductDetail',
'action' => 'default',
'id' => [
Route::FILTER_IN => function ($id) {
$product = $this->productRepository->getById($id);
return $product !== null ? $id : null;
},
],
])
tim vracenim null dojde k rejectnuti routy a nette bude zkouset dalsi
jeste se ti mozna hodi globalni filtry, kde mas pristup ke vsem parametrum z url
- MajklNajt
- Člen | 494
Kcko napsal(a):
@DavidMatějka Pokud v routeru vykoná dotaz zda se jedná / existuje produkt a to samé potom bude dělat nekde v ProductPresenter tak tu máme 2 stejné SQL dotazy; pokaždé v jiné vrstvě a docela zbytečně. Lze to nějakým fíglem udělat 1 dotazem?
to už je práca pre productRepository, aby dotazy do DB dával iba vtedy, keď to je potrebné, môžeš napríklad využiť cache… ;)
- Kcko
- Člen | 468
MajklNajt napsal(a):
Kcko napsal(a):
@DavidMatějka Pokud v routeru vykoná dotaz zda se jedná / existuje produkt a to samé potom bude dělat nekde v ProductPresenter tak tu máme 2 stejné SQL dotazy; pokaždé v jiné vrstvě a docela zbytečně. Lze to nějakým fíglem udělat 1 dotazem?
to už je práca pre productRepository, aby dotazy do DB dával iba vtedy, keď to je potrebné, môžeš napríklad využiť cache… ;)
To je pravda no :-), v času položení otázky, mě to nenapadlo.