Volání nestatické funkce z BasePresenteru v modelu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
FJP
Člen | 124
+
0
-

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

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?

matopeto
Člen | 395
+
+1
-

Pripadne mozno do modelu dat funkciu ako delegata(callback), a niekde v setupe mu ju nastavit.

Editoval matopeto (13. 7. 2015 12:35)

FJP
Člen | 124
+
0
-

David Matějka napsal(a):

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?

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

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

FJP napsal(a):

David Matějka napsal(a):

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?

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

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

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

@FJP tak to presun do sluzby, tu si injectni do BasePresenteru, kde porad bude existovat ta metoda, jen bude volat sluzbu..

duke
Člen | 650
+
0
-

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

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#…

FJP
Člen | 124
+
0
-

Ok, díky všem za cenné rady.

duke
Člen | 650
+
+1
-

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();