Przy starcie aplikacji wywołujemy metode Application::run() która wybiera akcje oraz widok. Uruchamia akcje, która z kolei może poprzez 'return' zwrócić:
+ Obiekt dziedziczący z klasy Action - wtedy kontroler uruchomi tę akcje (w ten sposób obsługiwane są łańcuszki akcji.
+ Inne, dowolne dane - wtedy kontroler traktuje je jako wynik działania akcji(łańcuszka) i przekazuje go do widoku(poprzez konstruktor). Na końcu kontroler wyświetla widok.
Po 1. Powiedzcie co tu może być źle przezemnie zrozumiane itd. Co można poprawić/zmienić. Jestem otwarty na propozycje ;]
Po 2. Mam problem z obsłużeniem błędów akcji. Takich jak np. w akcji 'showNews' brak newsa w bazie danych. Na razie obsługuje to jako łańcuszek jednak problem pojawia się, gdy akcja 'showError' korzysta z innego widoku niż akcja 'showNews'. Trzeba by było jakoś sensownie ten widok podmieniać. Jak ?
Albo jak rozwiązań to "fajnie". Mam wrażenie (pewnie uzasadnione), że to co istnieje teraz jest dość felernym rozwiązaniem.
ps. nie chce wykorzystywać czegoś ala 'fallback-action' gdyz to umożliwia generowanie tylko jednego komunikatu błędu gdy ogólnie akcja się "spsuje".
Prosze o pomoc

Model:
<?php class NewsContainer { public function getNewsByID($iID) { if($iID <> 1) throw new NewsNotFoundException(); return new News('Jakis Tytul', 'Jakas Tresc'); } } class News { public $title, $content; public function __construct($title, $content) { $this->title = $title; $this->content = $content; } } ?>
Akcja:
<?php class showNews extends Action { public function display() { try { $model = new NewsContainer(); $news = $model->getNewsByID(1); return $news; } catch(NewsNotFoundException $e) { return new showError('Informacja', 'News o podanym ID nie istnieje'); } } } ?>
Widok:
<?php class showNewsAsHTML extends View { private $news, $_template; public function __construct($oNewsRecord) { $this->news = $oNewsRecord; $this->_template = new Smarty(); } public function display() { $this->_template->assign('news', $news); $this->_template->display('html/showNews.tpl'); } } ?>
Kontroler:
<?php class Application { public function run() { $sActionName = $_GET['action']; $sViewName = $_GET['view']; $mDataForView = $this->performAction(new $sActionName()); $oView = new $sViewName($mDataForView); $oView->display(); } public function performAction(Action $oAction) { $result = $oAction->perform(); /* Obsługa łańcuszków akcji */ if($result instanceof Action) $this->performAction($result); else return $result; } } ?>