Předání dat z RouterFactory do Presenteru

crassus
Backer | 76
+
0
-

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
+
+1
-

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 | 76
+
0
-

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
+
+1
-

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 | 76
+
0
-

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
+
0
-

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

Kcko
Člen | 465
+
0
-

@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?

MajklNajt
Člen | 471
+
+2
-

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 | 465
+
0
-

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.