Objektový návrh a závislosti

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

Zdravím,
mám takú všeobecnejšiu otázku k objektovému návrhu. Potreboval by som usmerniť v prístupe k problému a možno aj v terminológii.

Majme napríklad 2 objekty/entity: payment, user.

User robí/má payment-y
Payment patrí user-ovi.

Príde mi praktické prístupovať k objektom v orm štýle, napr.:

$user->getPayments(); // returns Payment[]
//alebo
$user->getLastPayment(); // returns Payment

Napadlo mi niečo také riešiť modelmi Payments a Users, ktoré by slúžili na prácu s entitami.
Chcel by som teda, aby konkrétny user mal napr. svoje meno, ale vedel aj získať platby.
Preto napr. :

class User
{
	/** @var Payments */
	private $payments_model;
	/** @var array */
	private $data;

	public function __construct($data_from_db, Payments $payments_model){
		$this->data = $data_from_db;
		$this->payments_model = $payments_model;
	}

	public function getLastPayment(){
		$this->payments_model->getLastPayment($this->data['user_id']);
	}
}

Tým, že je entita User závislá na Payments modeli/službe, vlastne pridávam závislosť na Payments modeli aj do modelu/služby Users – pretože keď chcem v Users vytvoriť jednu entitu usera, potrebujem do konštruktora strčiť aj Payments model/službu.
No a potom je Users model závislý na Payments modeli a naopak – cyklus.

Viete mi poradiť, kde je principiálne problém?

Editoval tomolas (21. 1. 2015 16:11)

Pavel Kravčík
Člen | 1183
+
0
-

A co použít nějaké ORM?

A funkci getLastPayment můžeš vyřešit přes related(), pokud jí chceš v entitě. Osobně bych to přesunul z entity do modelu.

tomolas
Člen | 66
+
+2
-

Áno, to by určite šlo. Prakticky to je ale problém – ide o väčší existujúci projekt, kde by nasadenie ORM bolo komplikované. Existujúce riešenie sa spolieha na to, že sú služby magicky dostupné aj v ďalších službách a závislosti sa nepredávajú explicitne.

Mňa ale zaujíma, ako sa ten problém rieši architektúrou. Ide mi skôr o to pochopiť riešenie, ako použiť orm. Ďakujem ale za odpoveď.

Jan Suchánek
Člen | 404
+
0
-

Možná něco takového řeší nextras/orm,

nebo uestla/YetORM.

Editoval jenicek (21. 1. 2015 18:25)

webdata
Člen | 153
+
0
-

jenicek napsal(a):

Možná něco takového řeší nextras/orm,

nebo uestla/YetORM.

Pokud je to nějaký existují projekt a chcete co nejrychleji to přepsat do ORM tak doporučuji uestla/YetORM
A to z důvodů: 1/má základ ORM, 2/ prakticky si můžu něco speciálního doprogramovat. YetORM je takový úvod do ORM, časem pak můžete přejít na nextras/orm a nebo doctrine.

Co se týče nextras/orm tak to jsem nezkoušel. A osobně mě odrazuje od jeho nasazení na nějaký nový projekt to, že je ještě pořád nějak ve vývoji.

Editoval webdata (21. 1. 2015 18:53)

tomolas
Člen | 66
+
0
-

Ďakujem za odvede, páni!
Musím si to naštudovať.