Jak správně používat jinou knihovnu v prezenteru

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

Mejme classu (která dědí z Nette\Object) a tato třída ke své činosti potřebuje několik modelů. V rámci zachování DI si tyto modely předáme v konstruktoru.

Jak ale tuto třídu volat z prezenteru:

  1. vytvořit instanci a té předat potřebné modely?
  2. Zaregistrovat tuto třídu jako servisu/továrničku v konfigu

Nebo úplně jiné řešení?
Díky za radu.

enumag
Člen | 2118
+
0
-

Druhá možnost plus inject metoda pro předání služby do presenteru.

jean_cz
Člen | 12
+
0
-

enumag napsal(a):

Druhá možnost plus inject metoda pro předání služby do presenteru.

Ok, díky. Jen ještě dotaz. Je celý mechanizmus lazy. Nebo se všechny objekty definované v konfigu) vytvářejí vždy.

enumag
Člen | 2118
+
0
-

Vytváří se pouze pokud je nějaká jiná služba (případně presenter) vyžaduje v konstruktoru nebo inject* metodě. V tomto ohledu to tedy je lazy, ale…

…úplně lazy to však taky není. To že XXX má závislost na YYY znamená, že YYY potřebovat může, ale nikoli že to opravdu použije, typicky do presenteru injectuješ více služeb, ale některé jsou třeba jen při jedné konrétní akci a jindy se tato služba vytvářela zbytečně. V presenterech to lze řešit takto.

EDIT: Mimochodem v debugbaru je panel ve kterém jasně uvidíš všechny služby co jsou v DIC registrované a které z nich se při daném požadavku opravdu vytvořily.

Editoval enumag (11. 2. 2013 14:18)

vvoody
Člen | 910
+
0
-

Myslím že stačí nerobiť z presenteru a služieb multifunkčné obludy (obsahujúce veľa závislostí) a pri ich inicializácií (v konštruktore, seteroch a injectoroch :D) nerobiť žiadne zložité úkony.

enumag
Člen | 2118
+
0
-

@vvoody: Rozhodně. :-) Bohužel naučit se používat fasády chvíli trvá, nechtěl jsem to zesložiťovat.

jean_cz
Člen | 12
+
0
-

Jasně, šlo mi jen o to, jak oddělit nějakou logiku od presenteru. Například pro znovupoužití v jiném prezenteru.

Filip Procházka
Moderator | 4668
+
0
-

Registrace jako služba je rozhodně nejlepší volba.

Můžeš zkusit použít tohle, aby to bylo pořádně lazy :)

Majkl578
Moderator | 1364
+
0
-

enumag napsal(a):

Bohužel naučit se používat fasády chvíli trvá, nechtěl jsem to zesložiťovat.

Jakou souvislost mají fasády s lazy instanciací? Nemyslel jsi náhodou dekorátory?

jean_cz
Člen | 12
+
0
-

postoupil jsem trochu dál, ale radši se zeptám, jestli nejsem úplně mimo…

  • Mám model
  • Mám třídu s logikou, která je závislá na modelu
  • Mám prezenter (nebo i více prezenterů), které jsou zavislé na modelu a také na tříde

Přemýšlím špatně, když si ve třídě zvyditelním model do prezenteru injectuju pouze onu třídu? Použití třídy v prezenteru by pak bylo:

<?php
$this->class->udelejneco(); // udelejneco je metoda tridy
$this->class->model->getTable(); // data z modelu prostrednictvim tridy
?>
enumag
Člen | 2118
+
0
-

@Majkl578: Naprosto žádnou, reagoval jsem na @vvoodyho příspěvek. že z presenterů by se neměly stávat multifunkční obludy. Btw. těmi dekorátory jsi myslel co? Pattern jsem si našel, ale nějak nevím jak bych to udělal v PHP – leda traitou.

@jean_cz: Ta třída už je vlastně facade. Imho by Presenter měl pracovat pouze s touto třídou, která by případně měla obsahovat proxy metody na ten model, tj. myslím že by Presenter na model neměl sahat přímo.

Editoval enumag (12. 2. 2013 11:50)

redhead
Člen | 1313
+
0
-

enumag napsal(a):
Btw. těmi dekorátory jsi myslel co? Pattern jsem si našel, ale nějak nevím jak bych to udělal v PHP – leda traitou.

Já spíš nechápu souvislost dekorátoru a lazy inicializace. Pokud s nemýlím, k tomu slouží proxy, což je také svým způsobem dekorátor (resp. používá se stejně), ale oba mají naprosto jiný účel.

Editoval redhead (12. 2. 2013 13:45)