Volání nestatické funkce z BasePresenteru v modelu
- FJP
- Člen | 124
Ahoj,
mám aplikaci, která má dva moduly Admin a Front a nad nimi je samozřejmě
BasePresenter, od kterého dědí.
V BasePresenteru mám nestatickou funkci vocabulary() a potřebuji ji zavolat v modelu a nevím, jak na to.
Nějak přes kontext? Ale jak tam případně zapsat ten basePresenter? … prosím o konkrétní zápis, nevím si rady ://
- David Matějka
- Moderator | 6445
Mohl by sis injectnout Nette\Application\Application
a z toho
pote vytahnout aktualni presenter pres getPresenter
, ale to by mela
byt az posledni moznost. Opravdu je nutne, aby ta fce byla v BasePresenteru?
neslo by to presunout do nejake sluzby?
- FJP
- Člen | 124
David Matějka napsal(a):
Mohl by sis injectnout
Nette\Application\Application
a z toho pote vytahnout aktualni presenter presgetPresenter
, ale to by mela byt az posledni moznost. Opravdu je nutne, aby ta fce byla v BasePresenteru? neslo by to presunout do nejake sluzby?
Děkuju, postup funguje. O službě jsem také premýšlel, ale bohužel by to pro mě v nynějším stavu bylo komplikované, alespoň vím pro příště.
- duke
- Člen | 650
Model vůbec nemá co spoléhat na to, že presenter má nějakou metodu vocabulary. Měl by být naprosto nezávislý na konkrétní implementaci presenteru. Vlastně by o presenteru vůbec nic neměl vědět.
Jak už ti napověděl @matopeto, můžeš to řešit např. přes události, tj. tak, že si presenter zaregistruje nějaký specifický obslužný kód pro událost emitovanou modelem.
- vvoody
- Člen | 910
FJP napsal(a):
David Matějka napsal(a):
Mohl by sis injectnout
Nette\Application\Application
a z toho pote vytahnout aktualni presenter presgetPresenter
, ale to by mela byt az posledni moznost. Opravdu je nutne, aby ta fce byla v BasePresenteru? neslo by to presunout do nejake sluzby?Děkuju, postup funguje. O službě jsem také premýšlel, ale bohužel by to pro mě v nynějším stavu bylo komplikované, alespoň vím pro příště.
V čom by to bolo komplikované? Aké featury/funkcie presenteru využíva ta funkcia?
- FJP
- Člen | 124
duke napsal(a):
Model vůbec nemá co spoléhat na to, že presenter má nějakou metodu vocabulary. Měl by být naprosto nezávislý na konkrétní implementaci presenteru. Vlastně by o presenteru vůbec nic neměl vědět.
Při návrhu jsem nepočítal (nenapadlo mě to) s tím, že by model tu funkci vůbec potřeboval (ta funkce je překladová a v modelu je formulář pro použití na více místech aplikace, která je z více modulů.
Jak už ti napověděl @matopeto, můžeš to řešit např. přes události, tj. tak, že si presenter zaregistruje nějaký specifický obslužný kód pro událost emitovanou modelem.
Tohle moc nechápu.
- FJP
- Člen | 124
V čom by to bolo komplikované? Aké featury/funkcie presenteru využíva ta funkcia?
Přes model vocabulary kouká do databáze pro překlady → pak ji používám v presenterech, modelech a je jí potřeba volat i v šablonách, a proto mi přišlo, že BasePresenter je pro ní nejvhodnější umístění.
- David Matějka
- Moderator | 6445
@FJP tak to presun do sluzby, tu si injectni do BasePresenteru, kde porad bude existovat ta metoda, jen bude volat sluzbu..
- duke
- Člen | 650
Pokud nějaký tvůj model (nějaká služba) potřebuje pro svou funkčnost přístup k překladům (zvaž, zda ji skutečně potřebuje), měl by mít deklarovanou závislost přímo na tom překládacím modelu (překládací službě) a nikoli na presenteru.
To, že presentery a jejich šablony již takovou závislost mají, neznamená, že každý model musí překládat přes presenter. Není k tomu žádný důvod. Jen si zbytečně děláš model závislý na view vrstvě, což je principiálně špatně.
- vvoody
- Člen | 910
FJP napsal(a):
V čom by to bolo komplikované? Aké featury/funkcie presenteru využíva ta funkcia?
Přes model vocabulary kouká do databáze pro překlady → pak ji používám v presenterech, modelech a je jí potřeba volat i v šablonách, a proto mi přišlo, že BasePresenter je pro ní nejvhodnější umístění.
Ako píše @DavidMatějka a tie závislosti do šablóny sa predávajú cez template factory, je to služba ktorú môžeš nahradiť svojou, ktorá bude dediť od tej pôvodnej triedy https://api.nette.org/…ory.php.html#…
- duke
- Člen | 650
FJP napsal:
Při návrhu jsem nepočítal (nenapadlo mě to) s tím, že by model tu funkci vůbec potřeboval (ta funkce je překladová a v modelu je formulář pro použití na více místech aplikace, která je z více modulů.
Formuláře nepatří do modelu. Pokud pro komunikaci s daným modelem používáš specifický formulář, můžeš si na to udělat komponentu (formulář bude její součástí).
Jak už ti napověděl @matopeto, můžeš to řešit např. přes události, tj. tak, že si presenter zaregistruje nějaký specifický obslužný kód pro událost emitovanou modelem.
Tohle moc nechápu.
Jde o to, že místo abys z nějaké modelové služby volal:
$translation = $presenter->vocabulary('whatever'); // špatně, služba je závislá na presenteru
...
… můžeš využít událostí modelové služby, tj. v presenteru něco jako:
$service->onWhatever[] = function () {
$translation = $this->vocabulary('whatever');
...
}; // žádná závislost služby na presenteru nevzniká
Modelová služba se pak jen stará o vyvolání dané události. (viz dokumentace událostí):
$this->onWhatever();