Dáta pre celý web z databázy podľa url

matik58
Člen | 3
+
0
-

Čaute,

zaujímalo by ma, či ste niekto riešili alebo ako to najlepšie vyriešiť.

  1. Mám dve domény domena.sk a domena.cz.
  2. Na základe routingu získam persistentné parametre „host“ (domena) a „locale“ (sk|cz).
  3. Následne so získanými údajmi v presenteri na „startup“ chcem pingnúť DB (tabuľka „mutation“ so stĺpcami „id“, „host“, „locale“) a identifikovať o ktorú mutáciu webu ide na základe „host“ a „locale“.
  4. Získané „id“ chcem následne používať v každom presenteri a zároveň aj v každej komponente, pretože každá DB tabuľka bude mať FK „mutation_id“.

Aktuálne to riešim tak, že presenter má atribút, ktorý sa naplní v metóde „startup“ a každý komponent má tiež tento atribút a settujem ho pri create() volaní komponenty.

Moja otázka znie, ako najlepšie AutoWirovať „mutation_id“ skrz celý systém.

Ďakujem.

Editoval matik58 (14. 11. 1:48)

MajklNajt
Člen | 498
+
0
-

ahoj, nahradil by som ten tvoj atribút servisou, do ktorej v startup iba predáš $host a $locale, a túto servisu potom žiadaj v constructore každej triedy, ktorá potrebuje pracovať s mutation_id

class MutationProvider
{
	private int $mutationId;

	public function __construct(private MutationModel $model) {}

	public function setParams(string $host, string $locale)
	{
		$this->mutationId = $this->model->findOneBy($host, $locale);
	}

	public function getMutation(): int
	{
		return $this->mutationId;
	}
}

MutationModel je obálka nad databázou (neviem, či používaš Nette DB, Doctrine, Nextras…)

matik58
Člen | 3
+
0
-

Perfektné, ďakujem.

matik58
Člen | 3
+
0
-

Ešte mam jeden dotaz.

Ako je najlepšie riešiť push tychto dat do šablóny? V ramci presenteru som to dal v rámci beforeRender ako $this->template->mutation = $this->mutationProvider->getData()no zaujima ma ako to dat aby aj v komponente som tie data mal (nieco ako $user je dostupny aj v presentery ale aj v komponente)

MajklNajt
Člen | 498
+
0
-

čistá cesta by bola v každej komponente, v ktorej s tým pracuješ, vyžiadať si MutationProvider cez constructor

alternatíva je použiť https://doc.nette.org/…onfiguration#…

1. vytvoríš si rozhranie

interface MutationControl
{
	function setMutationProvider(MutationProvider $mutationProvider): void;
}

2. v komponente implementuješ toto rozhranie

class MyOwnControl extends Control implements MutationControl
{
	private MutationProvider $mutationProvider;

	public function setMutationProvider(MutationProvider $mutationProvider): void
	{
		$this->mutationProvider = $mutationProvider;
	}
}

3. v config.neon nastavíš niečo takéto

decorator:
	MutationControl:
		setup:
			- setMutationProvider(MutationProvider)

nie je to úplne najčistejšie riešenie, ale nemám vedomosť, že by to šlo ešte inak, keď tak nech ma niekto opraví/doplní…

larryx
Člen | 8
+
+1
-

Ja by som kazdej komponente vytvoril factory a ta ma automaticky autowiting z DI containera…

MajklNajt
Člen | 498
+
+1
-

larryx napsal(a):

Ja by som kazdej komponente vytvoril factory a ta ma automaticky autowiting z DI containera…

áno, to som písal ako „čisté riešenie“, a k tomu som ponúkol alternatívu