Vkládání modelů do presenteru

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

Dobrý den, chci se zeptat jak funguje vkládání modelů do presenterů. Je možné vytvářet jejich instance přímo v presenteru?
Vím že je lze registrovat jako službu, ale pokud mám hodně modelů, bylo by to přece zdlouhavé.
A pokud budu model vytvářet jako službu, nevím jak jí předám nějaké parametry.
Například budu mít model:

class User
{
   public function __construct($id, $name, $email){
   }
}

Jde tento model zaregistrovat jako službu? parametry konstruktoru doplní až presenter z formuláře.

Díky za rady

Tomáš Votruba
Moderator | 1114
+
0
-

Pokud chceš vytvářet instance přímo v presenteru, nemohou být registrovány jako služby (jejich instance vytváří Nette samo).

Čeho chceš přesně docílit? Možná by to šlo elegantněji.

Můžeš stejná data předat metodě, kterou bys volal tam kde potřebuješ – doplní až presenter z formuláře?

bluray
Člen | 178
+
0
-

Neřeším ted žádný konkrétní případ, nebo spíš ano, vím o dvou možnostech jak vytvářet modely, bud vytvořit instanci v presenteru, nebo ho vkládat jako službu. S nette se teprve seznamuji tak bych chtěl vědět jak se to dělá správně.
Data bych sice metodě předávat mohl, ale když použiju třídu z předchozího příkladu…Budu načítat uživatele z databáze třeba do pole instancí třídy User, tam budu potřebovat data zadávat do konstruktoru.
Další věc je to DI. začínám mít v tom zmatek. Pro přístup k db musí mít každý model v konstruktoru Context, to mi taky nepřijde příliš vhodné. Já jsem to vyřešil tak, že jsem udělal třídu Model která kontext sama vytváří a ostatní jsou jejími potomky.
Jenom mi jde o to, ujistit se že to dělám správně a popřípadě získat nějaké tipy od zkušenějších :)

David Matějka
Moderator | 6445
+
0
-

V tvem pripade vypada User jako nejaka entita nebo jako nejaka prepravka na data. Takova trida nema byt registrovana jako sluzba – jako sluzba by mela byt registrovana trida, ktera s tim pracuje, treba UserManager coz by byla trida, ktera by onu User nacitala, ukladala, mazala…

Já jsem to vyřešil tak, že jsem udělal třídu Model která kontext sama vytváří a ostatní jsou jejími potomky.

jako pro kazdou instanci vytvori novy Context s vlastnim pripojenim do db? to opravdu neni idealni :)

Pro přístup k db musí mít každý model v konstruktoru Context, to mi taky nepřijde příliš vhodné

To je prave princip DI, jen uvedu zavislosti, ktere chci a uz je na nekom jinem (v tomto pripade na DI kontejneru), aby zavislosti predal. Vubec se nechci starat o to, jak tu tridu vytvorit atd.

bluray
Člen | 178
+
0
-

Děkuji, už tomu začínám pomalu rozumět :)

Filip Procházka
Moderator | 4668
+
0
-

Ty jsi nenašel tohle vlákno a tohle video? :)