Jeden model pro všechny modely předání proměnný

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

Zdravím

chtěl bych se zeptat mám User model, který tahá data z DB a pracuje s nimi

mám i více modelů do kterých bych potřeboval dostat UserModel, ale nechce se mi u každého vytvářet instanci nebo parent::__construct().. atd.. nějaký nápady?

potřeboval bych získání UserModelu do presenterů a pak ještě přístup k modelům ale nějak mě nenapadá jak na to, možná jdu na to tak moc složitě, že jsem zapomněl na ty nejlechčí způsoby

předem díky za pomoc
Gery

James_Scott
Člen | 55
+
0
-

Třídu UserModel bych vytvořil jako abstraktní a všechny ostatní modely bych od ní dědil.
V presenteru pak přistupuj ke konkrétním modelům, kde budeš mít k dispozici i metody z UserModelu.
Modely si zaregistruj jako služby v konfiguráku a jestli máš verzi >2.0.5 tak jedině používej inject , zde inject pro 2.1

Jiří Nápravník
Člen | 710
+
0
-

Dědění v tomhle případě je nesmysl. Lepší řešení je, userModel dat jako service do configu. A potom v těch modelových třídách, kde ji budeš potřebovat udělej konstruktor tak, ež jako parametr tam dáš právě ten user modul, DIC kontejner se o to postará.

Konstruktor pak bude třeba takovýhle:

public function __construct(Cesta\Namespace\UserModel $model){
    $this->userModel = $model;
}
jo_Gerry_jo
Člen | 10
+
0
-

Jojo to všecko mám, ale přijde mi, když chci v presenteru udelat instanci modelu tak tam, musím zadat instanci acc… a to se mi zrovna nechce do každýho modelu dávat ;-) možná, to zase řeším blbě…

Šaman
Člen | 2668
+
0
-

Dědit UserRepository určitě ne. Bylo by to znásilňování dědičnosti (to se sice děje často, ale tohle by bylo obzvláště pervezrní znásilnění).
Méně čistý, ale pohodlný způsob je vytvořit si třídu Model(Manager/Locator) jako serviceLocator, tedy třídu, která si injectuje všechny repozitáře, výpočtové třídy apod. A tuhle třídu si pak předat do každého presenteru a servisních tříd (klidně v BasePresenteru a BaseModelService). Pak budeš odkudkoliv přistupovat k UserRepository třeba jako $this->model->users.
Jinak myslím, že repository by měly být na ostatních nezavislé a že potřeba jednoho repository v druhém může ukazovat na chybu návrhu. Repository by mělo řešit CRUD operace ohledné jedné entity (skupiny entit) a všechna vyšší logika by měla směřovat do těch servisních tříd (které už mohou být závislé na několika repozitářích – které máš všechny přístupné přes $this->model->xxxRepository).

Druhý, čistější způsob je skutečně si do každé servisní třídy/presenteru injectovat jen ty repository/výpočtové třídy, které bude potřebovat. Jsou pak snadněji viditelné závislosti.

Dříve jsem používal ten serviceLocator model a nenarazil jsem. Pak jsem začal učit prográmko a přešel jsem na ten čistý způsob (celkově jsem zahodil pár pohodlných hacků, u kterých jsem cítil, že nejsou dost čisté k výuce.) :D