Objektový návrh a závislosti
- tomolas
- Člen | 66
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
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
Á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ď.
- webdata
- Člen | 153
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)