Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Dylemat projektowy - model w modelu, Na jeden model składają się dwa inne.
jarek_bolo
post
Post #1





Grupa: Zarejestrowani
Postów: 149
Pomógł: 12
Dołączył: 3.03.2008
Skąd: łódzkie

Ostrzeżenie: (0%)
-----


Korzystam z frameworka Kohana, ale myślę, że jest to w miarę niezależny od tego problem.

Mam model User, na którego składają się zawsze jeden Adres, i jeden lub więcej Samochodów.

I teraz dylemat polega na tym w jaki sposób dodawać model User?

Opcja 1:
Czy w akcji dodaj, kontrolera users po kolei stworzyć obiekty składowych modeli, dodać je (oczywiście zgodnie z kolejnością wymuszoną strukturą bazy i odwołaniami kluczy obcych) przypisując odpowiednio wartości kluczy obcych?
  1. <?php
  2. /**
  3.  * Kontroler (modele standardowe)
  4.  */
  5. class Users_Controller extends Controller {
  6.  
  7.  public function dodaj() {
  8.    // start transaction
  9.    $adres = new Adres_Model();
  10.    $adres->add();
  11.    // najpier dodaje adres, bo z racji tego, że user może mieć tylko jeden adres
  12.    // uznałem, że id rekordu adresu powinno znajdować się w tabeli User
  13.  
  14.    $user = new User_Model();
  15.    $user->adres_id = $adres->id;
  16.    $user->add();
  17.  
  18.    $car = new Car_Model();
  19.    $car->user_id = $user->id;
  20.    $car->add();
  21.    // commit
  22.  }
  23. }
  24. ?>


Opcja 2:
Czy może w akcji dodaj, kontrolera users wywołać metodę add() obiektu reprezentującego model User, a odpowiednie składowe modelu User, pododawać wewnątrz metody add()(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)

  1. <?php
  2. /**
  3.  * Model
  4.  */
  5. class User_Model extends Model {
  6.  
  7.  public function add() {
  8.    $adres = new Adres_Model();
  9.    $adres->save();
  10.  
  11.    $this->adres_id = $adres->id;
  12.    $this->save();
  13.  
  14.    $car = new Car_Model();
  15.    $car->user_id = $this->id;
  16.    $car->save();
  17.  }
  18. }
  19.  
  20. /**
  21.  * Kontroler
  22.  */
  23. class Users_Controler extends Controller {
  24.  
  25.  public function dodaj() {
  26.    $user = new User_Model();
  27.    // start transaction
  28.    $user->add();
  29.    // commit
  30.  }
  31. }
  32. ?>


Wybierając opcję 1 mam mniej powiązane ze sobą modele. Ale za to nawalone w kontrolerze kodu co przeczy zasadzie chudy kontroler gruby model.
Opcja 2 jest bardziej intuicyjna, kontroler raczej nie powinien być świadom z czego się skłąda user. Ma dodać usera i koniec. Obiekt Usera wie co jest mu do życia potrzebne i sobie to sam dodaje.

A może są jeszcze jakieś inne opcje??
Kłaniają się tu pewnie wzorce projektowe. Może jakaś fabryka Userów ?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
phpion
post
Post #2





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Ja tego typu sytuacje rozwiązuję po stronie kontrolera. Bardziej PRO byłoby chyba jednak wpakowanie takiej logiki do modelu. Byłoby to swego rodzaju imitacją triggerów.
Go to the top of the page
+Quote Post
jarek_bolo
post
Post #3





Grupa: Zarejestrowani
Postów: 149
Pomógł: 12
Dołączył: 3.03.2008
Skąd: łódzkie

Ostrzeżenie: (0%)
-----


No ja właśnie wybrałem opcję 2, ale ponieważ nie pewnie się czuję z tym to pytam tutaj (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Dodałem do takiej implementacji wyjątki, które potworzyłem sobie każdy oddzielny dla każdego modelu. Walidacja też jest w modelach i teraz jak gdzieś coś nie spełni reguł walidacji to wale konkretnym wyjątkiem i gra i buczy.
Całość nawet fajnie działa.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 25.08.2025 - 06:38