konto usunięte
Temat: Roszerzenie obiektu zwracanego z modelu
Witam,mam pytanie do doświadczonych użytkowników Zend Framework i architektury MVC w ogóle. Po przejrzeniu wielu anglojęzycznych postów chciałbym zapytać, jakie praktyki stosowane są na "rodzimym" podwórku.
Chodzi o rozszerzenie obiektu będącego wynikiem zapytania do bazy. Mamy jakiś model np.:
class News extends Zend_Db_Table_Abstract {
protected $_name = 'News';
function getNewsByTitle($title) {
$where = array('title = ?' => $title);
return $this->fetchRow($where);
}
}
Kontroler
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łóżmy jednak że chcę rozszerzyć zwrócony mi przez model obiekt. Załóżmy, że w widoku chcę mieć galerię, ale jej elementy wyświetlić 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 dodać po prostu metody do zwróconego obiektu. Najczęstszą radą jest zrobienie modelu w dwóch klasach: jedna obsługuje praktycznie tylko CRUD, i druga, która obsługuje obiekt pierwszej, tam tworzymy sobie dodatkowe metody i ten właśnie obiekt zwracamy do kontrolera i do widoku. Otrzymujemy coś na kształt:
class NewsGateway extends Zend_Db_Table_Abstract {
protected $_name = 'News';
function getNewsByTitle($title) {
$where = array('title = ?' => $title);
return $this->fetchRow($where);
}
}
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
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łówne zarzuty przeciw takiemu rozwiązanie:
- nie powinno dopuszczać widoku do manipulowania 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 być gotowy do przyjęcia 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.