Moze najpierw przedstawie ogolny schemat dzialania mojego systemu.
- Fasade stanowi FrontController
- FrontController tworzy instancje obiektow ResponseContext, RequestContext
- FrontController korzysta z pomocy ApplicationController
- ApllicationController wybiera z zadania modul i akcje do wykonania
- Mapper akcji parsuje plik XML i zwraca dane dt. lancuchow akcji, widokow dla poszczegolnych rezultatow wykonania danej akcji itd.
- ApllicationController korzysta z mappera akcji i udostepnia konrolerowi informacje o lancuchach akcji i widokach
- FrontController wykonuje w petli lancuchy akcji na danych modulach udostepniajac im kontekst Request i Response, a nastepnie wyswietla widok
I teraz moje pytanie. Chce miec mozliwosc generowania listy newsow w postaci xhtml, rss, pdf itd., a wiec nie chce na sztywno deklarowac, ze np. widok musi byc realizowany przez Smarty. Chce jakos zorganizowac wybor wyjscia w trakcie dzialania aplikacji.
Jak byscie rozwiazali ten problem? Wymyslilem, ze nieglupim rozwiazaniem byloby, aby zajal sie tym mapper akcji. W tym przypadku musialbym deklarowac w pliku XML typ wyjscia np.:
<module name="News"> <command name="add"> <state id="1"> <forward>getHtmlList</forward> </state> </command> <command name="getHtmlList"> <view type="html">news.tpl</view> </command> <command name="getPdfList"> <view type="pdf">news.pdf</view> </command> </module>
FrontController mialby korzystac z fabryki widokow, tworzyc widok typu zdefiniowanego w akcji (zakladajc ze fabryka widokow zwraca system widokow z zaimplementowanym interface'em View, aby wymusic istnienie metody display)
<?php $objView = ViewManager::getView($objAppController->getViewType()); $objView->display($objAppController->getView(), $objResponseContext); ?>
Myslicie, ze jest sens bawic sie w cos takiego, czy lepiej zrobic rozpoznawanie typu widoku na podstawie rozszerzenia pliku wlasnie w fabryce widokow? A moze macie zupelnie inne rozwiazanie?