![]() |
![]() ![]() |
![]() |
![]()
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 ![]() Model:
Akcja:
Widok:
Kontroler:
Ten post edytował Vengeance 1.03.2005, 16:48:44 -------------------- |
|
|
![]()
Post
#2
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 224 Pomógł: 40 Dołączył: 6.07.2004 Skąd: Wuppertal Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#3
|
|
Administrator PHPedia.pl Grupa: Developerzy Postów: 1 102 Pomógł: 2 Dołączył: 14.09.2003 Ostrzeżenie: (0%) ![]() ![]() |
W Oceny jest
![]() -------------------- |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 657 Pomógł: 2 Dołączył: 15.08.2003 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
http://forum.php.pl/index.php?showtopic=26844
Tu jest cały kod jednak w starszej wersji. Tzn tam jest rozdzielenie na akcje widok/logiki. Teraz jednak pracuje nad oddzieleniu tego wszystkie i stowrzeniu poprawnych akcji i widoków ![]() -------------------- |
|
|
![]()
Post
#5
|
|
![]() 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?
-------------------- |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 657 Pomógł: 2 Dołączył: 15.08.2003 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
No Coś ty ! Od kiedy kontruktor jest 'private'!
Takie coś stosuje się tylko w Singletonie. Przcież ustawnienei 'private' uniemożliwi ci zrobienie '$obj = new Object();' hehe Dzieki i tak za uwage ;] czekam na kolejne ;p -------------------- |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 179 Pomógł: 0 Dołączył: 8.10.2004 Ostrzeżenie: (0%) ![]() ![]() |
Na początek, jako że jestem nowy na tym forum, chciałbym przywitać wszystkich forumowiczów
![]() Widzę, że i tu ludzie zmagają się z MVC. Cytat 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. Osobiście uważam, że łańcuszki akcji prawie nigdy ci się nie przydadzą. Lepiej operacje typu 'Usuń newsa' -> 'usuń artykuł' umieszczać w jednej akcji wywołując kilka klas modelu. W swoim frameworku mam metodę forward($action) kontrolera, którą może wywołać inna akcja. Tak realizuję łańcuszek. To akcja wywołuje następne akcje. Plus jest taki, że można na przykład wywołać inną akcję przed uruchomieniem właściwej. Można to zrobić tak jak u ciebie - to też jest dobre rozwiązanie. U mnie by się ono nie sprawdziło. Ale, tak jak powiedziałem, w praktyce 'łańcuszki akcji' spotyka się bardzo rzadko. Cytat + 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. To jest ciekawe rozwiązanie. Można w ten sposób na przykład przekazać listę błędów Validatora formularzy. Cytat 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. W moim frameworku nie ma akcji typu showNews/showArticle/showXX. To jest zadanie widoków. Przez akcję rozumiem coś, co zmienia model (addArticle, addNews, deleteNews). A zatem, jeśli http://www.mysite.com/index.php?view=showNews to wtedy nie ma potrzeby uruchamiania akcji. Odpalam tylko odpowiedni widok. Jeśli natomiast http://www.mysite.com/index.php?action=deleteNews to odpalam akcję, która decyduje, który widok wyświetlić (np. $controller->setView($name)). Widoki w moim frameworku chcę rozwiązać podobnie jak to jest w WACT. Też będą komponenty, tagi, z tym, że to wszystko będzie oparte na drzewie DOM (tyle, że bez używania DOM::save/load - to muszę niestety napisać sam :/). Jak rozwiązać problem błędów? Nie ma akcji typu showNews, więc sprawdzenia, czy dany news istnieje możesz dokonać w widoku. Nie wiem jak to będzie w smarty, bo odczuwam niechęć do tego systemu. Zobacz, jak to jest rozwiązane w WACT - IMHO znakomity sposób (z wykorzystaniem komponentów). A jeśli błąd wystąpi w akcji typu deleteNews to możesz przerwać akcję i wywołać setView('Error', $dane /* komunikaty o błędach */); Są różne sposoby. Właśnie przez takie drobne wydawałoby się problemy MVC staje się strasznie trudne do implementacji :/. Ja też na razie nie mogę wymyślić, jak radzić sobie np. z błędami Validatora, czy z autoryzacją. Odezwij się na gg to może razem coś wymyślimy ![]() |
|
|
![]()
Post
#8
|
|
Administrator PHPedia.pl Grupa: Developerzy Postów: 1 102 Pomógł: 2 Dołączył: 14.09.2003 Ostrzeżenie: (0%) ![]() ![]() |
Łańcuszki rzadko ? To zależy czy akcję są podzielone na akcje widoku i logiki. Te pierwsze mają za zadanie wyświetlić dane z modelu, a drugie wprowadzić zmiany w modelu. Przy takim układzie łańcuszki to rzecz naturalne: dodajemy news a później wyświetlamy informacje, albo przy niepowodzeniu, akcje logiki wyrzuca fallback(wyjatek), czyli w gruncie też akcje widoku.
Co sie w smarty moze się nie podobac ![]() Problem z łańcuszkami jest gdy chcemy wrzucić 2 akcje logiki do łańczuszka, bo co zrobić gdy jedna przejdzie a druga wyrzuci fallback. -------------------- |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 657 Pomógł: 2 Dołączył: 15.08.2003 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
@chmolu:
Łańcuszki właśnie przydają się często ![]() Cytat W moim frameworku nie ma akcji typu showNews/showArticle/showXX. To jest zadanie widoków. Przez akcję rozumiem coś, co zmienia model (addArticle, addNews, deleteNews). Wiesz, ja wychodze z założenia, że podel sam z siebie nie może być "uruchomiony". Tzn _zawsze_ musi wystąpić akcja, nawet jeśli jest działanie ogranicza się do zrobienia 'return true;'. Wtedy dopiero kontroler inicjuje widok. Pozatym w widoku nie pobieram żadnych danych bezpośrednio z modelu. Tego dokonuje akcja przekazując następnie wynik do modelu. Z tego właśnie wynika, że stosuje akcje typu showNews/showArticle/showXX. Cytat A jeśli błąd wystąpi w akcji typu deleteNews to możesz przerwać akcję i wywołać setView('Error', $dane /* komunikaty o błędach */); Także miałem pomysł, aby wykorzystać "coś" co jest w stanie zmienić widok. Metoda setView czy też jaki dodatkowy parametr zwracany w 'return'. Jednak wydawało mi się to jakieś "dziwne". Po to właśnie storzyłem ten wątek aby uzyskać inne sposoby ![]() -------------------- |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 179 Pomógł: 0 Dołączył: 8.10.2004 Ostrzeżenie: (0%) ![]() ![]() |
A może model zamiast wywalać wyjątek powinien po prostu zwrócić "pusty" obiekt, albo obiekt typu Error:
Wtedy twoj kod moglby wygladac tak:
|
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 657 Pomógł: 2 Dołączył: 15.08.2003 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Zauwaz, że akcja czesto dokonuje operacji na danych z modelu
![]() A wiec wole wyjatki (ladniej wylapuje sie blad). Jedyne co moge potwierdzic, to ze juz myslalem aby w performAction() dodac jeden warunek 'instanceof Error' co powodowalo by np. zmiane widoku, czy zdefiniowanej przez uzytkownika akcji, obslugujacej bledy. -------------------- |
|
|
![]() ![]() |
![]() |
Aktualny czas: 21.08.2025 - 18:21 |