Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dylemat projektowy - model w modelu
Forum PHP.pl > Forum > PHP > Object-oriented programming
jarek_bolo
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()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 ?
phpion
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.
jarek_bolo
No ja właśnie wybrałem opcję 2, ale ponieważ nie pewnie się czuję z tym to pytam tutaj 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.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.