Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework]Roszerzenie modelu
Forum PHP.pl > Forum > PHP > Frameworki
highlander82
Chodzi o rozszezenie obiektu bedącego wynikiem zapytania do bazy. Mamy jakiś model np.:

Kod
class News extends Zend_Db_Table_Abstract {        
     protected $_name = 'News';    
  
     function getNewsByTitle($title) {
       $where = array('title = ?' => $title);
      return $this->fetchRow($where);
     }    
   }


Kontroler

Kod
class News_Controller_Action extends Zend_Controller_Action {
     function indexAction() {
         $this->view->news->$this->_dbNews->getNewsByTitle('Alamakota');
       }        
   }


Kod oczywiście jest mocno uproszczony.
Jak dotąd wszystko proste i przyjemne. Założmy jednak że chcę rozszerzyć zwrócony mi przez model obiekt. Załóżmy, że w widoku

chcę mieć galerię, ale jej elementy wyświelić dopiero jeśli do newsa są dodane jakiekolwiek zdjęcia. Chciałbym to sprawdzić w

widoku za pomocą metody $this->news->hasGallery().
I tu zaczynają się problemy. Nie moge dodąc po prostu metody do zwróconego obiektu. Najczęstszą radą jest zrobienie modelu w

dwóch klasach: jedna obłsuguje praktycznie tylko CRUD, i druga, która obsługuje obiekt pierwszej, tam tworzymy sobie dodatkowe

metody i ten właśnie obiekt zwracamy do kotrolera i do widoku. Otrzymujemy coś na kształt:

Kod
class NewsGateway extends Zend_Db_Table_Abstract {        
       protected $_name = 'News';  
  
       function getNewsByTitle($title) {
         $where = array('title = ?' => $title);
         return $this->fetchRow($where);
       }            
  
   }


Kod
class News {        
       protected $_name = 'News';
  
       function __construct(NewsGateway $news) {
         $this->galleryGateway = new GalleryGateway();
         $this->title = $news->title
         $this->preface = $news->preface // etc. kolumny z tabeli news
  
       }          
  
      
       function isGallery() {
         $this->galleryGateway->isGallery(NewsGateway);    
       }
  
   }


Kontroler

Kod
class News_Controller_Action extends Zend_Controller_Action {
  
       function indexAction() {
         $news->$this->_dbNews->getNewsByTitle('Alamakota');
         $this->view->news = $this->News($news);
  
       }        
   }


Oczywiście po raz kolejny kod mocno uproszczony. Chodzi tylko o pewne zobrazowanie.

Głowne zarzuty przeciw takiemu rozwiązanie:
- nie powinno dopuszczać widoku do manipulownia na danych, a np. utworzenie metody getChild() dla pobrania jakiegoś potomka już jest taką manipulacją
- zbyt mocne powiązanie modelu z bazą w tabeli - teoretycznie powinien byc gotowy do przyjecia danych także z innych źródeł np. XML

Bardzo proszę o radę w tej sprawie. Jak wy radzicie sobie z takim problemem?

Z góry dziękuję za pomoc.
Sabistik
Rozszerz sobie tak samo odpowiednio Zend_Db_Table_Rowset / Zend_Db_Table_Row - opis w manualu.
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.