MVC od strony praktycznej |
MVC od strony praktycznej |
28.02.2006, 16:14:21
Post
#1
|
|
Grupa: Zablokowani Postów: 46 Pomógł: 0 Dołączył: 12.01.2006 Ostrzeżenie: (10%) |
O MVC na tym forum i w publikacjach elektronicznych oraz tradycyjnych napisano juz wiele. Jednak co publikacja, to nowa implementacji wzorca MVC. Widzialem juz projekt, w ktorym pobranie danych odbywalo sie w kontrolerze, a w modelu jedynie ich przechowywanie.
Mam taki problem. Nigdzie nie moge doczytac czy wzorzec MVC bierze cos takiego pod uwage, jak kilka modeli i widokow? Wiem, ze kontrolerow moze byc kilka. A co z modelami i widokami? I jak to zakodowac obietkowo? Problem: na podstawie url: index.php?akcja=newsy kontroler wybiera model Newsy, w ktorym pobierane sa wiadomosci z bazy danych. Nastepnie zostaja przeslane do dwoch widokow. Pierwszy to widok 'xml', ktory w ktorym generuje plik kanalu rss, a drugi widok to 'http', ktory uruchamia szablon Smarty z newsami. Jak to zakodowac obiektowo? Czy tak jak zademonstrowalem to ponizej?
poprawiam trzecie upomnienie. za czwartym będzie ostrzeżenie --- nospor I od razu nasuwaja sie pytania: 1. Jak zrobic, aby liczba widokow byla generowana dynamicznie (nie zawsze beda 2 widoki, moze byc 1,2,3 lub wiecej widokow) 2. Jak skonstruowac klase akcji? 3. Czy jedna akcja to pobranie modelu i przkazanie go widokowi? A raczej, to widok sobie pobiera model. 4. Co z danymi przeslanymi z formularza? Trafia do modelu i zostaje dopisane do bazy danych lub pliku xml; widok nie jest potrzebny. |
|
|
28.02.2006, 18:02:28
Post
#2
|
|
Grupa: Zarejestrowani Postów: 651 Pomógł: 28 Dołączył: 4.12.2004 Ostrzeżenie: (0%) |
Mi osobiście MVC ostatnio nie podchodzi... Wolę sobie tworzyć klasy odpowiedzialne za wykonywanie wszystkich operacji w danym obszarze (np. newsy-> add/del/edit/show_all/show_one), a później klasę akcji odpowiedzialną za wykonywanie operacji. W tej klasie osobne metody dla pobierania danych i osobne dla ich modyfikacji . Później przekazuję zmienne odpowiedniej metodzie w klasie akcji, która np. wypluwa jakąś tablicę do szablonu.
Posłużę się własnym przykładem: ad.3. ja za pomocą metody z klasy akcji pobieram model, a wyświetlaniem obarczam szablon i plik, który go generuje ad.4. widok możesz wykorzystać do wyświetlania komunikatów na podstawie przekazywanych zmiennych. -------------------- Sygnatura niezgodna z regulaminem.
|
|
|
28.02.2006, 18:46:10
Post
#3
|
|
Grupa: Moderatorzy Postów: 1 566 Pomógł: 37 Dołączył: 14.05.2003 Skąd: Kraków |
Ostatnio trochę zreformowałem swój pogląd na temat modelu.
Więc Model to wszystkie operacje, które są wykonywane, przez dany moduł (np. pobieranie newsa). Akcja jest pośrednikiem między Modelem a Widokiem.
1. Stwórz katalog Models i funkcje, która tworzy mapę wszystkich plików w tym katalogu 4. Model wszystko uruchamia. Akcje tylko pośredniczą np. w wysłaniu odpowiedniego komunikatu |
|
|
28.02.2006, 18:59:35
Post
#4
|
|
Grupa: Zarejestrowani Postów: 691 Pomógł: 0 Dołączył: 19.01.2005 Skąd: Warszawa Ostrzeżenie: (0%) |
ke? a nie __construct ($a) jeśli chodzi o MVC - koniecznie zapoznaj się z CakePHP. To doskonały i naprawdę bardzo prosty framework MVC. dwa artykuliki o podstawach Cake znajdziesz tutaj: http://fipaj.livenet.pl/articles/pmwiki.ph...akePHP.HomePage (taka autopromocja ) nawet jeśli nie zdecydujesz się na Cake'a - ten framework i tak uzupełni twoją wiedzę o MVC... -------------------- |
|
|
28.02.2006, 22:09:29
Post
#5
|
|
Grupa: Zarejestrowani Postów: 657 Pomógł: 2 Dołączył: 15.08.2003 Skąd: Łódź Ostrzeżenie: (0%) |
Cytat Mi osobiście MVC ostatnio nie podchodzi. A kto mówi, że sposób który opisałeś to nie MVC? :] Sam twierdzisz, że rozdzielasz kod na akcje (add/del/edit) i wydzilasz także odpowiednie metody pobierania danych (model) jak i metody do ich wyświetlenia (view). Nikt nie mówi, że MVC wymusza na Tobie tworzenia oddzielnych klas dla tych rzeczy. Ba... moższ to nawet na funkcjach zrobić Kiedy ludzie pojmą, że zasada MVC brzmi "Istnieją trzy wartstwy: logiczna, biznesowa i widoku" A jak ty to zaimplementujesz to twoja bajka ;P -------------------- |
|
|
28.02.2006, 22:28:06
Post
#6
|
|
Developer Grupa: Moderatorzy Postów: 2 844 Pomógł: 20 Dołączył: 25.11.2003 Skąd: Olkusz |
Cytat(Vengeance @ 2006-02-28 22:09:29) Kiedy ludzie pojmą, że zasada MVC brzmi "Istnieją trzy wartstwy: logiczna, biznesowa i widoku" A jak ty to zaimplementujesz to twoja bajka ;P wiesz, juz wymyslili w tym temacie na tyle duzo ze nie trzeba nic samemu wymyslac, co do samego wprowadzenia mvc jest pare wdrozen. @autor swoja droga ta co przedstawiles to najbardziej dziwna implementacja jaka widzialem |
|
|
28.02.2006, 23:05:08
Post
#7
|
|
Grupa: Zarejestrowani Postów: 657 Pomógł: 2 Dołączył: 15.08.2003 Skąd: Łódź Ostrzeżenie: (0%) |
eMartio: wrecz odwrotnie - kontroler jest jeden, a widoków i modeli wiele :]
A żeby nie zrobic zbytniego syfu w klasie będącej kontrolerem, rozdziela się jego zadania na podrzędne klasy (zwane akcjami). Tak na prawde to, czy Akcje zaimplementujesz jako jakąś metodę kontrolera (vide cakePHP) czy oddzielną klasę (mojavi?) zależy od Ciebie. Widok zaś to nie koniecznie tylko xml/html. Widokiem to po prostu to co wcześniej nazwałbyś "plikami szablonów". Więc odpalasz kontroler, który na podstawie URLa decyduje co zrobić(akcja). Operuje więc na modelu (select,update,insert,delete) i wyświetla wynik (np. smarty). Chodzi po prostu oto, by nie pchać w jedno miejsce wymieszanych ze sobą instrukcji sql, operacji na danych oraz htmla. Rozdzielenie tego jest podstawą. -------------------- |
|
|
28.02.2006, 23:09:49
Post
#8
|
|
Grupa: Zablokowani Postów: 46 Pomógł: 0 Dołączył: 12.01.2006 Ostrzeżenie: (10%) |
MVC - MODEL-VIEW-CONTROLLER + ACTION
Przed chwilka stworzylem cos takiego: INDEX.php:
INCLUDES:
Oczywiscie, nalezy dodac w kontrolerze walidacje danych wejsciowych. Jest to mocno wstepny zarys mojej wersji implementacji wzorca MVC w aplikacji napisanej w php 5. Prosze o uwagi, sugestie, komentarze. Jak to oceniacie, co zmienic, dodac... ? Tak na marginesie: w ostatnim czasie czytalem wiele publikacji na temat implementacji MVC w php i smiesza mnie teorie wiekszosci "programistow". Okreslenia typu, ze widok to szablon Smarty, a nie klasa ja implementujaca (forum WebHelp) czy np. pobieranie danych z bazy zrealizowane w kontrolerze, a nie w modelu (php Solutions z 2005 r.). Bardzo podobal mi sie artykul "Wprowadzenie do MVC" autorstwa hawk oraz publikacja "The Model View Controller Pattern". Przegladalem kilka frameworkow MVC. Niestety, wiekszosc implementujac w nim wzorzec MVC odbiegala od jego zalozen. To tyle odnosnie moich przemyslen na ten temat... Ten post edytował eMartio 1.03.2006, 08:50:21 |
|
|
28.02.2006, 23:38:31
Post
#9
|
|
Grupa: Zarejestrowani Postów: 657 Pomógł: 2 Dołączył: 15.08.2003 Skąd: Łódź Ostrzeżenie: (0%) |
"Okreslenia typu, ze widok to szablon Smarty, a nie klasa ja implementujaca"
Się nie zgodze. U mnie "widok" to pliki z katalogu /theme (zwykłe pliki html przeplatane prostym php <?php echo $title;?>) i klasa Template z metodami: assign, fetch, display; Teraz w akcji tworze obiekt Template, assignuje zmienne i robie display() na odpowiednim pliku z /theme. I po co mi tu oddzielna klasa? -------------------- |
|
|
1.03.2006, 08:48:50
Post
#10
|
|
Grupa: Zablokowani Postów: 46 Pomógł: 0 Dołączył: 12.01.2006 Ostrzeżenie: (10%) |
Cytat(Vengeance @ 2006-02-28 22:38:31) "Okreslenia typu, ze widok to szablon Smarty, a nie klasa ja implementujaca" Się nie zgodze. Chodzi mi o to, że u kolesia widok to jedynie szablon Smarty czyli jakis_tam_plik.tpl. Natomiast widok to rowniez klasa, ktora inicjuje sytem szablonow smarty. Np.
Jest to klasa widoku odpowiedzialna za prezentacje danych w HTML. Mozna, a nawet nalezy stworzyc rowniez klase odpowiedzialna za prezentacje danych w xml-u, pdf-ie czy e-mailu. Wiele osob tworzacych aplikacje na podstawie wzorca MVC wysyla maile prosto z modelu, co kloci sie z zalozeniami wzorca MVC! Przeciez zadne dane z modelu nie powinny wychodzic z aplikacji na zewnatrz nie przechodzac przez widok! Model nie wie w jakim widoku jego dane zostana uzyte. To go nie interesuje... Ten post edytował eMartio 1.03.2006, 08:49:47 |
|
|
1.03.2006, 11:23:09
Post
#11
|
|
Grupa: Zarejestrowani Postów: 2 262 Pomógł: 21 Dołączył: 3.05.2004 Skąd: Sopot, Krakow, W-wa Ostrzeżenie: (0%) |
eMartio - jesli zawsze na sile bedziesz sie trzymal zasad MVC to twoj kod sie zrobi absurdalny. Gdzies jest granica pomiedzy wykorzystaniem a uzytecznoscia wzorca.
-------------------- Javascript, Coffeescript, Node.js, Mongo, CouchDb, chmury, workery & inne bajery - zycie jest zbyt krotkie aby miec nudna prace :)
|
|
|
1.03.2006, 12:17:46
Post
#12
|
|
Grupa: Zablokowani Postów: 46 Pomógł: 0 Dołączył: 12.01.2006 Ostrzeżenie: (10%) |
Cytat(NuLL @ 2006-03-01 10:23:09) eMartio - jesli zawsze na sile bedziesz sie trzymal zasad MVC to twoj kod sie zrobi absurdalny. Gdzies jest granica pomiedzy wykorzystaniem a uzytecznoscia wzorca. NULL, racja... A czy moge prosic o poprawienie powyzszego kodu, tak aby stosowac wzorzec MVC od strony praktycznej, a nie teoretycznej? |
|
|
1.03.2006, 16:42:59
Post
#13
|
|
Grupa: Zarejestrowani Postów: 657 Pomógł: 2 Dołączył: 15.08.2003 Skąd: Łódź Ostrzeżenie: (0%) |
eMartio: nie zgodzę się wcale z tym, co napisałeś dwa posty powyżej. Jeżeli możesz... przedstaw jak masz zamiar używać tego swojego "widoku" w perspektywnie całości aplikacji? Bo ja i tak nie widze sensu tworzenia jakiej kolwiek klasy dla widoku! (no może poza 30 linijkową obsługującą pliki szablonów).
-------------------- |
|
|
1.03.2006, 17:56:07
Post
#14
|
|
Grupa: Zarejestrowani Postów: 487 Pomógł: 7 Dołączył: 7.01.2004 Skąd: Warszawa Ostrzeżenie: (0%) |
W niektórych sytuacjach taką klasę stworzyć niestety trzeba by nie wpinac PDFów w akcji. Kiedy output to html/text/rss można ten krok oczywiście pominąć, nie mniej jeśli w gre wchodzą bardziej fantazyjny output klasa pośrednicząca jest dobrym rozwiązaniem.
Przykład, który został podany wcześniej nie jest do końca trafny - to w dalszym ciągu jest HTML więc nie ma po co tworzyć klasy pośredniczącej (tym bardziej sztywno zawierającej smarty). Myślę, że dobrym przykładem może być Mojavi - gdzie są różne metody obsługi widoku od PHPView oraz PHPTalView przez SmartyView po XSLTView. Klasa widoku dziedziczy z określonego typu widoku (powiedzmy PHPView) i przekazuje atrybuty do szablonu. W chwilach gdy żadna akcja nie jest wykonywana, bo przecież przy pokazywaniu listy produktów nie ma żadnych modyfikacji danych takie rozwiązanie zastępuje nam pisanie niepotrzebnego kodu w akcji. Ten post edytował splatch 1.03.2006, 18:00:37 -------------------- Łukasz Dywicki
Independent Java and open source software consultant. Blog - Java, OSGi, integracja oprogramowania.. |
|
|
1.03.2006, 18:38:11
Post
#15
|
|
Grupa: Zarejestrowani Postów: 651 Pomógł: 28 Dołączył: 4.12.2004 Ostrzeżenie: (0%) |
eMartio: Wydaje mi się, że za bardzo kombinujesz z tymi szablonami.
Mam na myśli to: Cytat
Nie wiem, z jakiego systemu szablonów korzystasz, ale np. za pomocą Smarty można pominąć te ambarasy . Można zrobić np. tak:
Idea jest taka, że na podstawie zmiennych przekazywanych w adresie pobierasz za pomocą metody $action->site() tablicę z odpowiednimi danymi, a w szablonie Smarty są instrukcje wyświetlające odpowiednie dane, gdzie każda tablica siedzi w zmiennej $array i jest generowana w zależności od podanych parametrów, które są np. w adresie strony. Inkludować pliki *.tpl też możesz w samym szablonie. Na dobrą sprawę nie wiem, jak masz zorganizowane to wszystko u siebie, ale na pierwszy rzut oka wydaje mi się ten fragment kodu przekombinowany . (właściwe to w moim przykładzie zmienna $site pełni funkcję zmiennej $this->dane w Twoim przykładzie). Zgodzę się, że przypadku jakichś specyficznych danych typu PDF jest sens tworzenia klasy widoku, aczkolwiek, jak już wcześniej przedmówcy wspomnieli, w przypadku danych typu html lub xml, jest to bez sensu. Cytat A kto mówi, że sposób który opisałeś to nie MVC? :] Sam twierdzisz, że rozdzielasz kod na akcje (add/del/edit) i wydzilasz także odpowiednie metody pobierania danych (model) jak i metody do ich wyświetlenia (view). Ale teorytycznie nie jest to czysty MVC , gdyż mam w jednej klasie metody do modyfikacji danych i ich pobierania (czyli model+kontroler i do tego rozproszone), a wydaje mi się, że MVC rozgranicza te dwie sprawy . Po prostu w niektórych sytuacjach, gdzie musiałem wykonywać operacje na różnych danych, ładowanie wszystkich metod pobierających dane w jedno miejsce i wszystkich metod modyfikujących je w inne miejsce, wydało mi się czymś, co może spowodować bałagan. Moje założenia czerpią trochę z MVC, lecz nie kopiują go w pierwotnej formie. Nietrudno można dojść do wniosku, że nie ma sensu sztywno stosować idei modelu widoku i kontrolera. Czasem lepiej trochę ją nagiąć i zmodyfikować w celu usprawnienia działania aplikacji oraz dla zachowania porządku w projekcie . -------------------- Sygnatura niezgodna z regulaminem.
|
|
|
1.03.2006, 22:30:54
Post
#16
|
|
Grupa: Zablokowani Postów: 167 Pomógł: 2 Dołączył: 15.02.2004 Ostrzeżenie: (30%) |
Czy możecie mi wytłumaczyć jedną rzecz? Jaką rolę odgrywa akcja w aplikacji tworzonej na wzorcu MVC?
Powiedzmy, mamy do zrealizowania takie zadania: a. sprawdzenie czy user jest zalogowany b. aktualizacja danych c. pobranie innych danych To czy akcja to każdy z tych 3 zadań czy jednak akcja to będzie tylko aktualizacja danych czyli punkt 'b'? I druga rzecz, jak powyższa rzecz jest realizowana? Sterownik sprawdza czy user jest zalogowany. Jeżeli tak, to przekazuje sterowanie do kontrolera akcji, który wywołuje pierwszy model aktualizując dane, a następnie wybiera widok, który wywołuje drugi model i pobiera z niego dane do prezentacji na stronie. Czy to tak działa? Proszę o praktyczne opisanie powyższego przykłądu, bo trochę się już w tym pogubiłem... Ten post edytował Martio 1.03.2006, 22:31:18 |
|
|
2.03.2006, 00:34:42
Post
#17
|
|
Grupa: Zarejestrowani Postów: 172 Pomógł: 0 Dołączył: 22.09.2002 Skąd: Gorzów Wlkp Ostrzeżenie: (0%) |
Hej.
A ja z tego co pamiętam fajnie to było rozwiązane w PHIEND'zie i własnie na tym bazuje we wlasnych rozwiazaniach. Akcje zostaly podzielone na dwa rodzaje - widokowe i logiczne. Logiczne wykonuje pewne operacje(np. aktualizacja danych usera - korzystajac z modelu do zarzadzania userami), nastepnie przekazuja informacje do kontrolera o tym czy sie to powiodlo, a kontroler wie co ma dalej uruchomic w calym lancuchu przetwarzanych akcji(zdarzen). Jezeli all bylo ok, wywoluje akcje(widokowa) ktora konczy caly proces zmiany danych i np. przekazuje do szablonu gratulacje i nowe dane po aktualizacji. to chyba tyle pozdrawiam anas |
|
|
2.03.2006, 01:18:56
Post
#18
|
|
Grupa: Zarejestrowani Postów: 487 Pomógł: 7 Dołączył: 7.01.2004 Skąd: Warszawa Ostrzeżenie: (0%) |
W springu całość wygląda trochę inaczej - oisałem to na tyle, na le potrafiłem na moim blogu.
Dla niektórych rodzajów widoków nie trzeba tworzyć klas pośredniczących, nie doszedłem jeszcze jak przełączyć view resolvera, ale na 90% jest to możliwe. -------------------- Łukasz Dywicki
Independent Java and open source software consultant. Blog - Java, OSGi, integracja oprogramowania.. |
|
|
4.03.2006, 00:39:07
Post
#19
|
|
Grupa: Zarejestrowani Postów: 657 Pomógł: 2 Dołączył: 15.08.2003 Skąd: Łódź Ostrzeżenie: (0%) |
Na blogu wystawiłem opis (a raczej UML) mojego Pinky Framework. Może to być dobry (bądź zły;P) przykład do tego tematu.
Proszę też o wszelkie uwagi (lepiej w komentarzach niż tutaj). -------------------- |
|
|
Wersja Lo-Fi | Aktualny czas: 23.04.2024 - 14:40 |