Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [mvc] Problem z obsługą błędów, + Ocena obecnego kodu
Vengeance
post
Post #1





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

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


Oto mały przykład "wycięty" z mojego, powstającego jeszcze frameworka (jak widac pisanego mniej wiecej wg zasad MVC).
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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Model:
  1. <?php
  2. class NewsContainer
  3. {
  4.    public function getNewsByID($iID)
  5.    {
  6.       if($iID <> 1) throw new NewsNotFoundException();
  7.       return new News('Jakis Tytul', 'Jakas Tresc');
  8.    }
  9. }
  10.  
  11. class News
  12. {
  13.    public $title, $content;
  14.    public function __construct($title, $content)
  15.    {
  16.       $this->title = $title;
  17.       $this->content = $content;
  18.    }
  19. }
  20. ?>


Akcja:
  1. <?php
  2.  
  3.    class showNews extends Action
  4.    {
  5.       public function display()
  6.       {
  7.          try {
  8.             $model = new NewsContainer();   
  9.             $news = $model->getNewsByID(1);
  10.             return $news;
  11.          } catch(NewsNotFoundException $e) {
  12.             return new showError('Informacja', 'News o podanym ID nie istnieje');
  13.          }
  14.       }   
  15.    }
  16.  
  17. ?>


Widok:
  1. <?php
  2.  
  3.    class showNewsAsHTML extends View
  4.    {
  5.       private $news, $_template;
  6.  
  7.       public function __construct($oNewsRecord)
  8.       {
  9.          $this->news = $oNewsRecord;
  10.          $this->_template = new Smarty();
  11.       }
  12.  
  13.       public function display()
  14.       {
  15.          $this->_template->assign('news', $news);
  16.          $this->_template->display('html/showNews.tpl');
  17.       }   
  18.    }
  19.  
  20. ?>


Kontroler:
  1. <?php
  2.  
  3. class Application
  4. {
  5.       public function run()
  6.       {
  7.          $sActionName = $_GET['action'];
  8.          $sViewName = $_GET['view'];
  9.             
  10.          $mDataForView = $this->performAction(new $sActionName());
  11.          $oView = new $sViewName($mDataForView);
  12.          $oView->display();
  13.       }
  14.  
  15.       public function performAction(Action $oAction)
  16.       {
  17.          $result = $oAction->perform();
  18.          /* Obsługa łańcuszków akcji */
  19.          if($result instanceof Action)
  20.             $this->performAction($result);
  21.          else 
  22.             return $result;
  23.       }
  24. }
  25.  
  26. ?>


Ten post edytował Vengeance 1.03.2005, 16:48:44
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Kinool
post
Post #2





Grupa: Zarejestrowani
Postów: 560
Pomógł: 0
Dołączył: 15.07.2003
Skąd: Kwidzyn

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


tak na marginesie to:
Cytat
public function __construct($title, $content)
konstruktor powienien byc raczej bez deklarowaia go jako public, domyslnie jest private, no chybaze ze to zamierzony zamiar wywolania ale nie bardzo rozumie do czego?
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 17.09.2025 - 23:40