Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [ZendFramework]Roszerzenie modelu, W jaki sposób dodać do obiektu zwracanego przez model nowe metody?
highlander82
post 7.04.2009, 12:16:45
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 16.09.2007
Skąd: Poland

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


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.

Ten post edytował highlander82 7.04.2009, 12:18:55
Go to the top of the page
+Quote Post
Sabistik
post 8.04.2009, 08:53:07
Post #2


Administrator wortalu


Grupa: Przyjaciele php.pl
Postów: 960
Pomógł: 39
Dołączył: 21.10.2003
Skąd: Kraków

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


Rozszerz sobie tak samo odpowiednio Zend_Db_Table_Rowset / Zend_Db_Table_Row - opis w manualu.
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 20.06.2025 - 13:09