Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework]do czego model
Forum PHP.pl > Forum > PHP > Frameworki
agnieszkagdansk
moze głupie pytanie, ale wszystkie moje pliki model wyglądają tak samo, czyli
  1. <?php
  2.  
  3. class nazwa_klasy extends Zend_Db_Table {
  4.   protected $_name = 'nazwa_tabeli';
  5.  
  6.  
  7. }
  8. ?>


W jakich przypadkach bede musiała coś tu dodawać ?
-=Peter=-
ZF nie narzuca sztywnego modelu. Nie jestem super biegły w ZF, bo dopiero od niedawna się go uczę, ale pochodne klasy Zend_Db_Table służą tylko jako akcesor do danych z bazy danych. Możesz sobie zrobić dwie (lub trzy - taki jest przykład w dokumentacji) hierarchie klas, gdzie jedna będzie rozszerzała Zend_Db_Table (dostęp do bazy danych), a druga (klasę bazową możesz sobie napisać sama) będzie te dane heremtyzowała.

Ja jak narazie korzystam z 3 równoległych hierarchi klas, przykładowo:

  1. <?php
  2. class Model_DbTable_Article extends Zend_Db_Table{
  3.  $_name = 'article';
  4. }
  5.  
  6. class Model_Mapper_Article{
  7.  private $dbTable;
  8.  
  9.  public function __construct(){
  10.    $this->dbTable = new Model_DbTable_Article();
  11.  }
  12.  
  13.  /**
  14.    * @return array Tablica obiektów Model_Article
  15.    */
  16.  public function fetchAll($select){
  17.    //wyszukiwanie danych za pomocą $this->dbTable
  18.    //oraz załadowanie danych do obiektów Model_Article
  19.  }
  20.  
  21.  /**
  22.    * @return Model_Article
  23.    */
  24.  public function findOne($pk){
  25.    //..
  26.  }
  27.  
  28.  /* inne metody, np. save, delete */
  29. }
  30.  
  31. class Model_Article{
  32.  private $data = array();
  33.  private $fields = array('id', 'title', 'content');
  34.  private $mapper;
  35.  
  36.  public function __construct($data = array()){
  37.    $this->data = $data;
  38.    $this->mapper = new Model_Mapper_Article();
  39.  }
  40.  
  41.  public function __get($name){
  42.    //sprawdzenie czy istnieje $this->fields[$name]
  43.    //ewentualnie sprawdzenie czy istnieje metoda 'get'.$name i jej wywołanie
  44.    return $this->data[$name];
  45.  }
  46.  
  47.  public function __set($name, $value){
  48.    //sprawdzenie czy istnieje $this->fields[$name]
  49.    //ewentualnie sprawdzenie czy istnieje metoda 'set'.$name i jej wywołanie
  50.    $this->data[$name] = $value;
  51.  }
  52.  
  53.  public function save(){
  54.    $this->mapper->save($this);
  55.  }
  56. }
  57. ?>


Metody (fetchAll, find itp) klasy rozszerzająca Zend_Db_Table zwracają obiekty Rowset lub Row. Klasa mapper ma podobne metody co klasa tabeli, ale zwraca obiekty modelu Model_*, które to przechowują dane - czyli implementacja wzorca DAO.

Linki do manuala
http://framework.zend.com/manual/en/zend.d...ationships.html
http://framework.zend.com/docs/quickstart/...-database-table
plurr
osobiście nie potrafię ugryźć mappera, ogólnie mało o tym piszą chociaż szukałem sporo. Peter czy mógłbyś podać jakiś inny pełny przykład takiego mapowania, który by mi bardziej otworzył oczy na ten wzorzec?

Czy jest sens w ogóle nakładać tyle warstw na model? Przecież metody Model_Article można by śmiało umieścić w Model_DbTable_Article z ominięciem mapera (?) Niech mnie ktoś oświeci.
-=Peter=-
Tak jak napisałem, nie jest konieczna klasa mappera, jego funkcjonalność można przenieść na klasę tabeli rozszerzając odpowiednie metody.

Można to tak zrobić, że jedna hierarchia klas w modelu (ta która dziedziczy po table) wydobywa informacje z bazy danych, tworzy właściwe obiektu modelu i je zwraca. Druga hierarchia klas to klasy hermetyzujące dane z bazy danych - posiadają metody get/set do pobierania/ustawienia wartości poszczególnych pól (przykładowo kolumn z bazy danych, ale nie koniecznie). Dane (czyli ta warstwa która nie dziedziczy po table) nie powinna mieć nic wspólnego ze źródłem ich pochodzenia, więc m. in. dlatego powinno się wydzielić tą warstwę. Jeśli chodzi o mapper, jest on coś w rodzaju "adaptera" klasy Table, który może dostarczać swój (inny lub taki sam) interfejs oraz zwraca nie obiekty Rowset, czy Row, ale tablicę obiektów lub jeden obiekt modelu heremtyzujących dane.

To o czym piszę to wzorzec Data Access Object, jego implementacją jest przykładowo Propel - klasy z przyrostkiem Peer pobierają dane z bazy danych i tworzą obiekty klasy bez przyrostka "Peer" (reprezentację danych).
DooBLER
Kilka dni temu zadałem podobne pytanie: Temat: ZendFramework_model_jak_to_dobrze_zorganizowac

Teraz znalazłem takie coś: http://weierophinney.net/matthew/archives/...astructure.html i zaczynam się w to wgryzać.

Z tego ci czytałem przez ostatnbie kilka dni to najlepiej jest mieć 3 klasy:
1 obiekt przechowujący dane
2 klasa rozszerzająca zend_db_table_abstract
3 klasa która to połączy - korzystając z obiektu klasy 2 upchnie dane do obiektu klasy 1 i go zwróci - obiekt z tej klasy robimy sobie w kontrolerze i jemu przekazujemy i odbieramy dane

jakoś tak to widzę.

Wszędzie jest dużo teori, ale jakieś przykłady praktyczne ciężko znaleźć.

Narazie boje sie nawet myśleć na temat relacji między tabelami...

Może ktoś powiedzieć czy dobrze kombinuję? a najlepiej podać jakieś przykładowe aplikacje na zf >=1.8

edit:
tutaj też znalazłem dość sensowny tekst na temat: http://akrabat.com/2008/12/13/on-models-in...rk-application/
Zaczyna mi się coraz bardziej rozjaśniać.
I widzę że ten przykład w tutorialu (QuickStart) na stronie ZF jest jakiś "dziwny", w sumie struktura plików jest podobnie jak opisałem wyżej, ale bezpośrednio w kontrolerze jest tam tworzony obiekt z klasy będącej "pojemnikiem" na dane. Przez co w tej klasie muszą być zdublowane metody klasy 3 z moich podpunktów.

Czy ktoś zaznajomiony z tematem mógłby się jakoś odnieść do mojej wypowiedzi i tamtego tutoriala?
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.