Dáta pre celý web z databázy podľa url
- matik58
- Člen | 3
Čaute,
zaujímalo by ma, či ste niekto riešili alebo ako to najlepšie vyriešiť.
- Mám dve domény domena.sk a domena.cz.
- Na základe routingu získam persistentné parametre „host“ (domena) a „locale“ (sk|cz).
- 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“.
- 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
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
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
č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í…