Ja proponowałbym tak:
mamy:
-jeden FrontController - index.php
-wiele Controller'ów
-wiele Modeli
-wiele View'ów
działanie FrontControllera:
1.wszystkie linki idą na FrontController i on decyduje który Controller i którą funkcje - czyli akcje - w nim odpalić ( i odpala

)
2.po zakończeniu się akcji zwraca ona jakies dane (powiedzmy obiekt Data), ktore FrontController odbiera
3.w Data->viewName zapisana jest nazwa View'a, który ma być odpalony. FrontController odpala ten View i przekazuje mu wspomniany już obiekt Data.
4.po zakończeniu się View'a jest koniec programu.
działanie Controller'a:
1.zaczyna działac gdy FrontController go stworzy i odpali jakąś jego funkcje
2.cos robi. Moze korzystac z POST i GET i z Modeli
3.Modele musi sobie zaladowac w zaleznosci od swoich potrzeb.
4.nie moze nic wypisywac(zadnych echo, print etc) ani korzystac z bazy danych,plikow i zrodel danych innych niz Modele
5.akcja musi zwrócic obiekt Data zawierający viewName i dane do wyswietlenia.
dzialanie View'a:
1.odpala go FrontController.
2.bierze dane z obiektu Data i wysietla je odpowiednio.
3.moze korzystac TYLKO z obiektu Data - zadnych modeli, controllerow, bazy danych, GET, POST itp
przyklad View'a który wyswietla strone HTML za pomocą Smarty:
<?php
class SmartyView
{
public function render($Data)
{
...
tworzy nowy obiekt Smarty na layoucie o nazwie powiedzmy $Data->params['layoutName']
...
daje Smartiemu zmienne z tablicy $Data->variables
...
odpala Smartiego
}
}
?>
przyklad View'a który wyswietla dane w postaci XML:
<?php
class XMLView
{
public function render($Data)
{
...
uruchamia PEAR'owski XMLSerializer->serialize( $Data->variables )
...
echuje wynik z odpowienim headerem XML
}
}
?>
działanie Modelu:
1.uzywany przez Controllery.
2.Jest posrednikiem miedzy zrodlem danych a Controllerem.
3.pobiera dane z np bazydanych i daje je w odpowiedniej formie Controllerowi
4.zmienia dane w bazie za poleceniem Controllera - moze je tez walidować.
przyklad Modelu :
<?php
class ArticleModel
{
public function getNewestArticle()
{
...
pobiera najnowszy artykuł z bazy z tablicy Articles (id, author_id, title, body)
...
pobiera nazwe autora z bazy z tablicy Users za pomocą author_id z artykułu
...
zwaca
array(id
,author_id
,author_name
,title
,body
) }
public function addArticle($author_id, $title, $body)
{
...
dodaje nowy artykuł do bazy do tablicy Articles (author_id, title, body)
}
}
?>