![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 24 Pomógł: 0 Dołączył: 8.07.2006 Ostrzeżenie: (0%) ![]() ![]() |
Witam
Od niedawna zaczalem interesowac sie MVC. Ale w dalszym ciagu nie wiem czy dobrze rozumuje istote MVC. Dlatego postanowilem napisac prosty (powtarzam, prosty, system) zeby sprawdzic czy ide w dobrym kierunku. Prosze o komentarze, jesli chodzi o sam schemat i istote wzorca MVC. Na poczatek przedstawie strukture katalogow: ./ - katalog glowny actions/ - katalog przechowujacy pliki .ini do wybranej akcji mozemy podac co ma zostac wykonane nastepnie configs/ - katalog z plikami konfiguracyjnymi - narazie nie uzyty controllers/ - katalog z kontrolerami - narazie tylko kontroler glowny models/ - katalog z plikami modeli views/ - katalog z plikami widokow index.php - plik glowny ktory uruchamia kontroler Zaczynamy od poczatku - kod kontrolera:
Zakladamy, ze uzytkownik wpisal: index.php?view=Users&action=addUser&userName=root kontroler laduje wiec model UsersMod:
i wykonuje w nim akcje zmianu danych, a poniewaz akcja addUser() posiada plik konfiguracjny z wywolaniem jako kolejnej akcji countUsers wywoluje kolejna akcje. No i pozostaje wyswietlenie widoku Users:
Co sadzicie o tym? Czy dobrze rozumuje istote MVC? Zapraszam do dyskusji... |
|
|
![]() |
![]()
Post
#2
|
|
Developer Grupa: Moderatorzy Postów: 2 844 Pomógł: 20 Dołączył: 25.11.2003 Skąd: Olkusz ![]() |
Jeżeli to działą, to jest dobre... Nie ma "szablonowej" implementacji tego wzorca w zadnym z jezyków, dla tego trzeba tylko znac załozenia i tworzyc własne.
Tutaj masz opis wzorca, nie implementacji: http://hwao.be/blog/2006/04/14/model-view-controller/ Raczej jak sa katalogi, to najmniej wazne poniewaz powinny byc ustawione przez stale (przynajmniej ja tak robie). Troche wydaje mi sie dziwny ten kontroler, poniewaz jest jakis taki "malo" elastyczny. Napisz pare aplikacji na tym to Ci zaraz przyjdzie do glowy jakies lepsze rozwiazanie. Umnie widok robi troche inna rzeczy, a to co jest u Ciebie, u mnie robi to system szablonów. |
|
|
![]()
Post
#3
|
|
Grupa: Moderatorzy Postów: 4 465 Pomógł: 137 Dołączył: 26.03.2004 Skąd: Gorzów Wlkp. ![]() |
Cóż. To zależy, czy widok ma wyciągac dane, czy aplikacja te dane wstawiać (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Niby różnica niewielka w praktyce, ale w podejściu do problemu ogromna :|
|
|
|
![]()
Post
#4
|
|
Grupa: Przyjaciele php.pl Postów: 1 224 Pomógł: 40 Dołączył: 6.07.2004 Skąd: Wuppertal Ostrzeżenie: (0%) ![]() ![]() |
@hwao co widok robi u CIebie ?
|
|
|
![]()
Post
#5
|
|
Developer Grupa: Moderatorzy Postów: 2 844 Pomógł: 20 Dołączył: 25.11.2003 Skąd: Olkusz ![]() |
Cóż. To zależy, czy widok ma wyciągac dane, czy aplikacja te dane wstawiać (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Niby różnica niewielka w praktyce, ale w podejściu do problemu ogromna :| Widok, wyciagac dane?! Widok ma inne zadania! To model jest warstwa ktora powinna pozyskiwac dane, z różnych źródeł! Podsumowujac, widok otrzymuje gotowe dane z modelu i zajmuje sie obrobka ich (prezentacja uzytkonikowi), model zajmuje sie wyciaganiem danych. @hwao co widok robi u CIebie ? Umnie głównym zadaniem widoku jest pozyskanie danych przez(od) modelu i poprzez system szablonów przedstawienie ich użytkownikowi. |
|
|
![]()
Post
#6
|
|
Grupa: Przyjaciele php.pl Postów: 1 224 Pomógł: 40 Dołączył: 6.07.2004 Skąd: Wuppertal Ostrzeżenie: (0%) ![]() ![]() |
u mnie element widok to 'class view extends smarty'...
w akcji pobieram poprzez model dane, assign do widoku, i display. |
|
|
![]()
Post
#7
|
|
Grupa: Moderatorzy Postów: 4 465 Pomógł: 137 Dołączył: 26.03.2004 Skąd: Gorzów Wlkp. ![]() |
Umnie głównym zadaniem widoku jest pozyskanie danych przez(od) modelu i poprzez system szablonów przedstawienie ich użytkownikowi. O to mi chodziło - o pozyskanie danych. Inaczej - czy widok jest pasywny, czy aktywny. Nie chodziło o pozyskanie danych z bazy. Ewentualne problemy z komunikacją wynikają z tego, że ja używam pojęcia <widok> na określenie szablonu/template'a/jakzwałtakzwał Ten post edytował Cysiaczek 8.07.2006, 23:08:29 |
|
|
![]()
Post
#8
|
|
Grupa: Moderatorzy Postów: 1 566 Pomógł: 37 Dołączył: 14.05.2003 Skąd: Kraków ![]() |
Jak na pierwsze starcie nie jest najgorzej.
Jak pisał hwao, niezbyt elastyczne to jest. Ja podzieliłem kontrolę na: Controller, webController -> FrontController, BlockController; ConsoleController. |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 338 Pomógł: 2 Dołączył: 4.03.2006 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Ostatnio napisalem (mam nadzieje) framework i z przyjemnoscia podziele sie moimi uwagami. 1. NAJWAZNIEJSZA ZASADA Jezeli piszesz framework dla siebie - pisz go tak, aby byl wygodny dla Ciebie. 2. MVC MVC mowi, ze masz miec model, widok i kontroler. Model nie wyswietla daych, widok nie grzebie w bazie. Kontroler umozliwia im jakas tam wspolprace. Nie podoba mi sie struktura katalogow. Tzn ja zmianilbym ja na nastepujaca: actions/ - kontrolery akcji models/ - modele views/ - widoki configurations/ - konfiguracje wszystkiego co zbudujesz na owym frameworku (np. akcji lub bibliotek, ktore bys mogl pozniej dodac.) konfiguracje mozesz zapisywac w plikach o przykladowych nazwach: DodajUzytkownikaAction.ini, UsunNewsaAction.ini, MojaBibliotekaJPEGLibrary.ini. Teraz nieco do kontrolera. Ktos powiedzial, ze jest malo elastyny. No w sumie trudno go zrobic innego, jak kolega dopiero zaczyna. Ja przyczepie sie do fragmentu nastepujacego:
Dlaczego ladujesz model? To nie nalezy do kontrolera. Ja wiem, ze moze byc tak wygodnie. Ale sa akcje w ktorych z niego nie skorzystasz. Przyklad? Akcja ktora wyswietla kominikat, jezeli nie znaleziono strony. Np masz akcje PokazZdjecia. Ktos wpisze adres: jakasStrona.pl/akcja=PokazFotografie. Jezeli kontroler nie znajdzie PokazFotografie to milo jest, jak odpalisz akcje np. NieZnaleziono. Ona wyswietli jedynie komunikat, zwroci Error 404 lub cos innego. Model nie jest tu najczesciej potrzebny. Zrob tak: 1. Sprawdz o jaka akcje uzytkownik prosi. np: strona.pl/akcja=PokazZdjecie. 2. Jezeli jest pusta (np. podano strona.pl/), to ustaw domyslna (np. StronaGlowna). 3. Jezeli nie jest pusta, pobiez ja i sprawdz czy istnieje. 4. Jezeli nie, przypisz akcji akcje NieZnaleziono. Sprawdz czy istnieje (tak dla spokoju) i jak nie ma akcji (usunales ja, albu dysk padl (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) ), to zglos jakis blad. 5. Jezeli akcja istanieje - uruchom ja. Teraz akcja jezeli chce, prosi po model, ustawia sobie widok. Pobiera dane z modelu, przekazuje je widokowi. Widok moze wyswietlic, albo zwrocic kontrolerowi (w kontrolerze piszesz $oWidok = $oAkcja->uruchom()(IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) . Wtedy kontroler ja wyswietla albo robi co mu sie podoba (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Zeby nie bylo malo, zalaczam fragmenty mojego kodu:
Dam jeszcze przyklad jak to jest z modelem:
Mama nadzieje, ze troche pomoglem. Adrian. |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 50 Pomógł: 0 Dołączył: 16.07.2005 Ostrzeżenie: (0%) ![]() ![]() |
Witam
Odgrzebuje temat, podpisuje się pod nim. Również zaczynam swoja przygodę z tym zagadnieniem, a nie chce zaczynać nowego topiku. @Prph Odnośnie rozmieszczenia katalogów. W swoim mini projekcie mam katalog moduły, w którym zawieram podział na np.: News, Products itp. W każdym z tych katalogów mam widok np (news_view, czy products_view, model (w skład modelu wchodzą dwie klasy ) ( 1- model reprezentuje u mnie klasa która jest odzwierciedleniem pól/kolumn bazy danych, 2 – klasa ze statycznymi metodami do zapisywania aktualizowania i pobierania danych itp. ) Widok to klasa która zawiera metody odpowiedzialne za konkretna akcje np.:
A w pliku menuTable.tpl.php prezentacja danych... Do tego mam jeden kontroler ktory zczytuje z url odpowiednie akcje i includuje odpowiednie pliki. Czy rozwiązanie które zaprezentowałem kwalifikuje się na mini MVC (wiem ze takie cos nie istnieje...) ? Czy w dobrym kierunku idę ? Pozdrawiam |
|
|
![]()
Post
#11
|
|
Grupa: Moderatorzy Postów: 1 566 Pomógł: 37 Dołączył: 14.05.2003 Skąd: Kraków ![]() |
W mvc chodzi o to, aby moduły/akcje były podzielone teoretycznie na kontroler akcji, widok akcji i model akcji. Jak sobie zimplementujesz to Twoja osobista sprawa.
|
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 338 Pomógł: 2 Dołączył: 4.03.2006 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Ociu dobrze mowi (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Pamietaj, ze MVC to nie framework. MVC to tylko ideologia pisania aplikacji. Podam Ci zupelnie inny przyklad jego uzycia, a w pelni poprawny:
Nie ma zadnego frameworka, a jednak MVC. Uyztkownik jest modelem - zauwaz, ze powiedzialem, ze dane sa w bazie danych, ale jednak nie ma tu najmniejszego kodu, ktory na to wskazuje. Tak naprawde wie o tym tylko model. On sie laczy z baza danych (mysql, postrgesql, czy nawet plikami xml) i zwraca nam to, czygo szukamy. Widok, to obiekt Smarty - systemow szablonow. Oczywiscie nikt nie kaze uzywac smarty (ja nie uzywam (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) ). Kontroler to index.php. Pobiera dane z $_GET, z modelu, przekazuje je do widoku i go wyswietla. Adrian. |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 50 Pomógł: 0 Dołączył: 16.07.2005 Ostrzeżenie: (0%) ![]() ![]() |
Zgadza sie, pytam, gdyz czytajac wiele artykulow w pewnym momencie nie wiedzialem za co sie zabrac, a bardzo mi zalezalo na tym aby moj kod php byl tak obiektowy jak kod java:) odstawilem wiec czytanie i zabralem sie za pisanie...
Wiec wnioskuje ze to co napisalem w poprzednim moim poscie mialo "jakis" sens skoro nie zostalem obrzucony i sprowadzony do parteru:). Super. Pozdrawiam! |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 504 Pomógł: 2 Dołączył: 31.03.2006 Skąd: Londyn Ostrzeżenie: (0%) ![]() ![]() |
i wykonuje w nim akcje zmianu danych, a poniewaz akcja addUser() posiada plik konfiguracjny z wywolaniem jako kolejnej akcji countUsers wywoluje kolejna akcje. No i pozostaje wyswietlenie widoku Pozwolilem sobie odgrzebac temat by zadac male pytanie. Ja postanowilem zaczac od czytania i zbierania wiedzy, ale wciaz jedna rzecz nie daje mi spokoju. Pliki akcji. Wszedzie gdzie czytam wyjasnione jest M V i C nie moge doczytac o akcjach. Z tego co jest podane wynika ze sa to jedne z najmniejszych niepodzielnych czynnosci, takie jak AddUser ModifyUser. Ok mozna przyjac ze akcja to wywolanie metody obiektu. Ale co z lancuchami i z plikami konfiguracyjnymi (z czego najbardziej nie zrozumiale sa dla mnie te drugie)? Co oznacza ze cos "posiada plik konfiguracjny z wywolaniem jako kolejnej akcji" Bede wdzieczy za maly wyklad ewentualnie linki do zrodel gdzie bedzie to idiotoodpornie wytlumaczone. Ten post edytował thornag 22.08.2006, 18:55:15 |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 338 Pomógł: 2 Dołączył: 4.03.2006 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Akcja: dobrze rozumiesz czym jest. Akcja to po prostu realiacja jakiegos zadania. Np: www.strona.pl?pokaz=galeria_fotografii. Z linku mozemy wywnioskowac, ze apliakcja php ma nam zaprezentowac galerie. To wlasnie galeria jest akcja. Tak samo moze byc akcja PokazNowosc, UsunUzytkownika. Lancuchy akcji Podczas jednego wywolania strony aplikacja php moze tak naprawde wykonac kilka kacji po kolei (czyli nastapi lancuch akcji). Jak? Oto przyklad: Uzytkownik przeglada fotki na stronie. JEdna sie sie podoba, klika na UsunZdjecie. Aplikacja php usuwa fotke z bazy lub z innego zrodla i powraca ponownie do wyswietlania fotek. Jak to jest z poziomu aplikacji? Zgloszenie: strona.pl/?akcja=UsunZdjecie&zdjecie=123. Odczytuje id zdjecia (123), usuwa zdjecie Uruchamia akcje PokazZdjecia. W efekcie uzytkownik odstaje fotki na ekranie, ale bez tej usunietej (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) . To samo da sie realizowac przy pomocy redirect:
Zaleta lancucha akcji jest taka, ze strony nie trzeba przeladowac, wiec oszczedza sie czas (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Efekt jest identyczny. Konfiguracja i lancuchy akcji Chyba chodzi o to, ze tworzony jest plik konfiguracyjny. znajduje sie w klatalogu configs/ i nazywa sie UsunZdjecie.php. Aplikacja otrzymuje zgloszenie aby uruchimic akcje UsunZdjecie. Zna nazwe akcji i wie, ze tak samo ma nazywac sie konfig. Wiec wczytuje konfiga. W konfigu moze byc podane: nastepna-akcja = 'PokazZdjecia'. Aplikacja wie, ze jak wykona akcje UsunZdjecie to ma wykonac PokazZdjecia. UWAGA: to rozwiazanie jest raczej kiepskie. Lepiej w akcji zrobic metode "forward($nazwaAkcji, $parametry)" i po zakonczeniu danej akcji uruchamiac ja. CZesto zdarzy sie, ze bedziemy musieli wykonac inna akcje, bo nastapil jakis blad (np nie podano parametru id do usuniecia zdjecia.). Pozdrawiam, Adrian. |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 504 Pomógł: 2 Dołączył: 31.03.2006 Skąd: Londyn Ostrzeżenie: (0%) ![]() ![]() |
Tak to wszystko miele i mam jeszcze kilka kolejnych pytan. Realizacja rejestrowania uzytkownika w frameworku opartym o wzorzec MVC. Kompletnie nie wiem z ktorej strony to ugryzc.
Dla przykladu. Zostaje wywolany URL http://www.domena.pl/view=RegistrationForm Kontroller laduje widok RegistrationForm, jako ze nie ma modelu ,kontroller laduje defaultowy model np index. W modelu index metoda np Perform jest pusta (musi zostac zaimplementowana gdyz chcialbym zeby model dziedziczyl po abstrakcyjnej klasie model). Kontroller laduje model, wywoluje pusta metode Perform modelu - nic sie nie zmienia. Kontroller wywoluje metode Display() - zostaje wyswietlony formularz rejestracyjny. Uzytkownik wypelnia formularz i klika w wyslij (walidacja po stronie przegladarki juz byla). I tutaj zaczynaja sie moje problemy. Jak to wyglada dalej ? Mam sobie obiekt Request i w nim moge przeprowadzic walidacje po stronie serwera. Ale jak to polaczyc dalej ? Akcja formularz powiedzmy wyglada tak. http://www.domena.pl/model=User&action=AddNewUser Kontroller laduje model User, i chce uruchomic akcje AddNewUser, i co dalej ?Ciagle potrzebuje walidacji bo nie wiem gdzie ja tutaj wcisnac, potrzebuje akcje w stylu User->setUsername($username), User->setAddress($address) itp, kiedy przelece przez wszystkie setCostam (powiedzmy ze walidacje ustawie w tych metodach), teraz musze wywolac Model->SaveUser() co powoduje zapisanie ustawionych pol do bazy danych. I teraz znow nie wiem co dalej, w tej akcji ustawic kolejna ktora ustawi widok na np RegistrationDone ? Same tutaj problemy, powiedzmy ze poczawszy od metody setUsername zawiera ona instrukcje zeby kolejna wywolac setEmail() ta znowu setAddress() itp. Ale co jesli bede chcial wykonac zwykla operacje zmiany Addressu, ktora normalnie wygladala by tak.
Jak sterowac takim dzialaniem za pomoca URL ? Gdzie tu wszedzie jest klasa Request ktora w gruncie rzeczy powstala u mnie po to zeby zajmowac sie calym I/O walidacja eskejpowaniem cytowaniem itp. Ogolnie jak mowie naczytalem sie sporo ale nie potrafie tego do kupy poskladac. Ten przyklad obslugi uzytkownika nurtuje mnie najbardziej, stad tez mam prosbe. Biorac pod uwage nastepujacy StoryBoard : Kod 1. Uzytkownik wchodzi na strone. Klika w "zarejestruj sie". Wypelnia formularz. Formularz nie zawiera bledow, uzytkownik widzi podziekowania. Uzytkownik jest na stronie glownej (zalogowany). Klika w profil. Chce zmienic swoj adres. 2. Uzytkownik wchodzi na strone. Klika w "zarejestruj sie". Wypelnia formularz. Formularz zawiera bledy, uzytkownik zostaje przekierowany na strone formularza(nie chodzi tutaj o informowanie co zrobil zle). Wypelnia jeszcze raz Co do mojej prosby, moglby mi ktos opisac jak takie cos zrealizowac ( nie chodzi mi o to zeby to ktos zaimplementowal (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) ), ogolnie taki Walkthrough na zasadzie: Uzytkownik jest na stornei glownej mamy URL kontroller robi to tamto. Pozniej jest na stronie ?view=form (czy cos) kontroller robi to i tamto. Wielkie dzieki za zainteresowanie. @Prph Raz jeszcze dzieki, w koncu lancuchy staly sie klarowne w teori (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) |
|
|
![]()
Post
#17
|
|
Grupa: Zarejestrowani Postów: 338 Pomógł: 2 Dołączył: 4.03.2006 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Nie podoba mi sie u Ciebie organizacja MVC. Po pierwsze: strona.pl?model=Cos - zgloszenie moze zawierac jedynie akcje i parametry. Uruchamiana jest akcja. Akcja wie jakiego widoku uzyje i jakiego modelu uzyje. Po drugie: nie kazda akcja potrzebuje modelu. Nawet polowa akcji nie wymaga modelu. Zobacz np. akcje DodajNowosc. Zadne dane nie pobierana sa z bazy (w naszym przykladzie). Akcja uzywa tylko widoku. Bywa tak, ze akcja uzywa tylko modelu, widoku zas nie. Np: ZapiszUzytkownika. Ko9lejna sprawa to uzywane kilku modeli w akcji. Zerknij:
Nie mozesz wiec automatycznie ladowac widoku i modelu do akcji. Zrob klase bazowa dla akcji np. Action. Kazda klasa akcji z niej dziedziczy. Action posiada uzyteczne metody getModel($sModel), getView($sView). Kiedy potrzebujesz modelu/widoku po prostu piszesz w swojej akcji:
Co z walidacja? Zajgorsza czesc aplikacji. Zawsze zajmuje najwiecej czasu i zawsze jest nudna (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Nie zastanawialem sie jak zrobie to w nowymn frameworku, ale poprzednio mmialem cos w stylu:
Pozdrawiam, Adrian. |
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 504 Pomógł: 2 Dołączył: 31.03.2006 Skąd: Londyn Ostrzeżenie: (0%) ![]() ![]() |
Hmm, duzo dalo mi to do myslania, tymbardziej ze przed chwilka mialem rozmowe ze znajomym programujacym w Javie. Do tej pory myslalem ze model odpowiedzialny jest za cala logike i to on steruje wszystkim. Z tego co zrozumialem z Twojego postu, nie bede sie upieral ze dobrze, wychodzi na to ze tak naprawde akcja jest plikiem wykonywalnym, ktora steruje i dobiera sobie i widok i model, ktory jak sadze zajmuje sie tylko przechowywaniem danych (takie kontener na dane).
Mamy plik index.php i url index.php?akcja=viewUser&id=4 Plik index.php includuje plik akcje/viewUser.php a w tym pliku mamy to wszystko o czym wspomniales czyli tak naprawde na sztywno wpiety kod. 1. Zainicjowanie modelu/klasy User (tutaj wszystko sie wczytuje do wlasniciowsci obiektu); 2. Dodanie wlasciwosci User(username etc) do szablonu np smarty. 3. Display widok taki czy taki. Jesli user chce zmienic swoje dane to zmienia formularz klika submit ktory prowadzi do index.php?akcja=modifyUser&id=4 i tutaj 1. Akcja inicjalizuje model User. 2. Wrzuca do niego zmienne POST 3. Zapisuje wszystko z bazie danych 4. Robi forward(viewUser) ktory robi to co opisane wyzej. Jesli dobrze zrozumialem to mam dwa kolejne pytania. Jaka role ma w tym wszystkim kontroler ? Co on kontroluje. I co z obiektem User ktory po przekierowaniu z formularza zostal utworzony ponowanie z wszystkimi wlasciwosciami i zapisany. Czy po akcji modifyUser gdy wywoluje akcje viewUser mam ladowac dane do obiektu/modelu jeszcze raz ? Jak to rozwiazac ? EDIT Przeczytalem caly temat jeszcze z dwa razy i wyciagnalem troche dodatkowych informacji (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Moje pojmowanie wyglada teraz tak. Mamy request http://www.domena.pl/action=viewUser&userid=1. W pliki index.php mamy (pseudokod)
Kontroler narazie zostawie, moja akcja viewUser
Teraz widok
Czy to ogolnie ma jakis sens ? Ten post edytował thornag 23.08.2006, 23:14:33 |
|
|
![]()
Post
#19
|
|
Grupa: Moderatorzy Postów: 1 566 Pomógł: 37 Dołączył: 14.05.2003 Skąd: Kraków ![]() |
Każdy sposób jest dobry, jeśli Ty uważasz, ze jest dobry. To jak ma działać Twój system to Twoja inicjatywa, a nie nasza. Jakby programiście mieli patrzyć, czy dobrze robią, nie powstały tak świetne frameworki jak mojavi, prado, symfony. Byłba by tylko jedna wytyczna: "Czy to wg. Was jest ok". Nie, to robimy tak, aby inni mieli dobrze. Tak to będzie istniał tylko jeden framework. Dlatego trzeba narzuć swój tok myślenia.
To było by tyle (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Saluto!, Wojtek |
|
|
![]()
Post
#20
|
|
Grupa: Zarejestrowani Postów: 504 Pomógł: 2 Dołączył: 31.03.2006 Skąd: Londyn Ostrzeżenie: (0%) ![]() ![]() |
@Ociu No tak. Ale inni programisci mogliby stwierdzic np "o mlody w dobrym kierunku to idzie,mozna by powiedziec ze widzi sie tu wzorzec MVC, tylko to jakies takie malo elastyczne, pomysl co by bylo gdyby..." (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)
Jak to sie mowi po co wywazac otwarte drzwi, jesli ktos z gory widzi ze ten tok rozumowania jest bledny, bo to to to (a tu w konstruktorze lepiej to przekazac, a tu lepiej dziedziczyc bo costam), lepiej zeby opieprzyl mnie teraz niz zebym za jakis miesiac dwa moze wiecej odkryl smutna prawde ze cala praca poszla na marne bo od poczatku wychodzilem ze zlych zalozen. @Prph Cytat actions/ - kontrolery akcji models/ - modele views/ - widoki configurations/ - konfiguracje wszystkiego co zbudujesz na owym frameworku (np. akcji lub bibliotek, ktore bys mogl pozniej dodac.) Mozesz wyjasnic co to sa kontrollery akcji a co jest w folderze configurations. Dalej mi to troche miesza. I kolejne pytanie do Ciebie. Jesli w modelu wystepuje blad (np bledne zapytanie SQL) co wtedy robisz ? Wyrzucasz wyjatek ? jesli tak to jak go obslugujesz. Ja myslalem zeby uzyc do tego metody forward tylko mam problem z wymysleniem jak przekazac wiadomosc. Myslalem tez zeby w bloku Catch zawrzec instrukcje ktora mi bedzie ten wyjatek razem z mesgiem obslugiwala (np poprzez forward (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) ). I jeszcze jedno teoretyczne. Przypuscmy ze akcja ma za zadanie skontaktowac sie z modelem i zazadac od niego listy uzytkownikow. Lista jest pusta. Czy w tym przypadku najlepiej jest korzystac z (znowu) forward ? Na zasadzie if(!count($arUsers)) oCtrl->forward(jakas tam akcja). Ten post edytował thornag 24.08.2006, 16:20:55 |
|
|
![]()
Post
#21
|
|
Grupa: Zarejestrowani Postów: 338 Pomógł: 2 Dołączył: 4.03.2006 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Jak interpretowac termin kontroler, to zalezy jak napisany jest dany framework. Ponadto istnieje tzw FrontController - uruchamiany jako pierwszy i to on niby powinien odpalac akcje.
Ale akcja takze moze byc nazwana kontrolerem. W Mojavi kontroler to GLOWNA czesc aplikacji. Ona rozbija adres url, wyciaga informacje o zgloszeniu. Ona odpala akcje i ona steruje aplikacja. W Zend Framework kontroler to klasa zawierajaca akcje, np:
Model jest odpowiedzialny za zapis, odczyt danych ze zrodla danych. A jakie jest zrodlo, to wie o tym tylko model. Chodzi o to, abys mogl pozniej wymienic model na inny i nie zmienic nawet jednej linii kodu w akcjach. Co zrobic gdzy SQL sie wylozy? Moim zdaniem jest to niestandardowa sytuacja i tutaj nadaje sie wyjatek. Lepiej niech aplikacja sie zatrzyma, niz ma dzialac z bladem. Jak przechwycic?
Forward to zle rozwiazanie. A co jezeli wyjatek wystapi podczas uruchamiania samego frameworka? Aplikacja bedzie w kólku i z niego nie wylezie :/ Poza tym - forward na nic sie nie przyda. Raczej redirect. Kiedy juz troche poczytasz o MVC i frameworkach, polecam pobrac Zend Framework i poczytac http://framework.zend.com/manual/pl/index.html - Bardzo dobra dokumentacja, z ktorej wiele sie nauczysz. Adrian. Ten post edytował Prph 24.08.2006, 21:39:53 |
|
|
![]()
Post
#22
|
|
Grupa: Zarejestrowani Postów: 1 873 Pomógł: 152 Dołączył: 9.04.2006 Skąd: Berlin Ostrzeżenie: (0%) ![]() ![]() |
Przeczytałem temat i teraz ja zadam pare pytań (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) . Troszke juz rozumiem o co chodzi ale jest pare niedogodności.
index.php
models/newsMod.php
i views/news.view.php
I teraz pare pytań. Co ma robic akcja i jak to ma wyglądać. teraz mam że akcja wywołuje metode w modelu, ale chyba nie o to chodzi? Jak mam trzymac akcje? Tzn. ma byc w pliku tak jak modeli i widok czy kontroler ma ja obsłużyć? |
|
|
![]()
Post
#23
|
|
Grupa: Zarejestrowani Postów: 504 Pomógł: 2 Dołączył: 31.03.2006 Skąd: Londyn Ostrzeżenie: (0%) ![]() ![]() |
@prph korzystajac z Twojej zyczliwosci a przedewszystkim cierpliwosci i dobrych rad postanowilem w koncu cos splodzic. No i wyglada to tak.
Controller
Przykladowy widok
I akcja
EDIT: I wywolanie
EDIT END Zaczalem wczoraj tak na dziko troche, fakt faktem tak jak pisales zdaje sobie sprawe z tego ze aplikacja moze sie zapetlic wiec musze dodac jeszcze jakies wyjatki i obsluge tych bledow, no chyba ze zalozenie ze akcja ActionDoesntExists i ViewDoesntExists i odpowiadajace jej widoki sa zawsze (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Ale jak to mowia lepiej dmuchac na zimne (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Ogolnie Prph, czy zrealizowalem ogolne zalozenia MVC tym kodem ? Jesli tak to oczywiscie zdaje sobie sprawe z tego ze to pierwszy framework i w miare budowania na nim aplikacji bede wpadal na nowe i (mam nadzieje) lepsze pomysly. Zalezy mi tylko na jakims komentarzu i stwierdzeniu wprost czy moj start jest zgodny czy nie zgodny z zalozeniami (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) P.S jeszcze nie testowalem, dzisiaj napisze klase Request i Abstrakcje dla DB i jakis model. (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Ten post edytował thornag 25.08.2006, 12:28:58 |
|
|
![]()
Post
#24
|
|
Grupa: Zarejestrowani Postów: 1 873 Pomógł: 152 Dołączył: 9.04.2006 Skąd: Berlin Ostrzeżenie: (0%) ![]() ![]() |
Thormag, powiem ci że nakierowałes mnie (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Kod mi sie podoba, ale jak narazie ja tez nie dokońca wiem czy to ma tak wyglądać (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) Czekamy na odpowiedź
Poczytałem torszkę o MVC (przyklejony temat) i juz conieco rozumiem. Trzeba to tko sensownie napisać. Mamy Kontroler który parsuje URL(np. klasą router) i uruchamia daną akcję. Akcja natomiast jeśli chce (nie musi) uruchamia model. Model zas uruchamia widok. A teraz np. jeśli damy action=AddNewsForm to akcja nie poprosi modelu a da nam odrazu widok. Czy o to chodzi? Prosze jakiegoś speca o odpowiedź czy dobrze rozumuje? |
|
|
![]()
Post
#25
|
|
Grupa: Zarejestrowani Postów: 504 Pomógł: 2 Dołączył: 31.03.2006 Skąd: Londyn Ostrzeżenie: (0%) ![]() ![]() |
Z tego co zrozumialem model nie ustawia widoku. Model to taki kontener na dane, jedna tabela w bazie danych (bez kluczy obcych) jeden model (czy tam GenericObject) Model pobiera dane i je oddaje, jak to juz nikogo nie obchodzi jego sprawa. U mnie tam w tym czyms co niekoniecznie musi byc MVC dziala to tak ze model sobie pracuje w sumie w oderwaniu od reszty. Akcja go uruchamia, akcja prosi o dane, jak je ma to analizuje i w zalezosci od tego co model zwrocil (moze nic nie zwrocic bo tabela pusta) ustawia odpowiedni widok, albo wykonuje kolejna akcje.
|
|
|
![]()
Post
#26
|
|
Grupa: Przyjaciele php.pl Postów: 698 Pomógł: 3 Dołączył: 28.03.2004 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Trochę zbyt sztywno trzymacie się powiązania modelu z klasami... Otóż model, to dane oraz ich zachowania... Model może być jeden, ale sposobów dostępu do niego może być wiele. Zmiana modelu to zmiana danych (czy ich zachowań), a nie klasy dostępowej... W końcu na model składają się też działania wykonywane w akcjach na danych. Zawsze kojarzyłem model z pojęciem abstrakcyjnym, którego raczej nie można przełożyć na jedną klasę.
Takie przynajmniej jest moje zdanie. Jak się pomyliłem, to chętnie posłucham, jak inni to widzą (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) |
|
|
![]() ![]()
Post
#27
|
|
Grupa: Zarejestrowani Postów: 1 873 Pomógł: 152 Dołączył: 9.04.2006 Skąd: Berlin Ostrzeżenie: (0%) ![]() ![]() |
Mhh, dobra to może teraz cos takieog pokaże. Fajnie działa:
index.php
libs/view.lib.php
models/index.model.php
views/index.view.php
no i ostanie actions/index.action.php
Czy jest juz na lepszej drodze? Powiem tlyo że to działa ?view=news&id=1 lub jak podasz tylko view=news to przejdzie do defaults() (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Jestem na dobrej drodze? Prosze powiedzieć prosto z mostu. "TAK" lub "NIE" (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) |
|
|
![]()
Post
#28
|
|
Grupa: Zarejestrowani Postów: 504 Pomógł: 2 Dołączył: 31.03.2006 Skąd: Londyn Ostrzeżenie: (0%) ![]() ![]() |
@Ludvik Czyli reasumujac i po ludzku mozna by powiedziec ze akcja i kontenery na dane to model i tyle. W sumie by sie zgadzalo, kontroller wywoluje akcje ktora jest modelem ta pracuje z jakimis danymi za posrednictwem jakis innych klas dostepowych czy tez klas przechowywujacych dane (ktore jak to mowilismy tez s amodelem). Wracajac do poczatku poprzedniego zdania z powodzeniem mozna zamienic "kontroller wywoluje akcje" na "kontroller wywoluje model". Teraz juz mi jasniej to wyglada dlaczego w miniFrameworku autorstwa Hwao w komentarzach jest ze tu a tu wywoluje on model a wygladalo dla mnie jak akcja (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) W koncu akcja tez model (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
A tak zupelnie na boku to po tym jak wczoraj splodzilem ten zalazek to strasznie mi brakowalo tego modelu, model tylko przechowywanie danych ? Zastanawialem sie wtedy dlaczego wzorzec sie nazywa MVC a nie AVC (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) No teraz juz wiem (chyba). @bim2 Teraz jak tak to wszystko czytam to sobie mysle ze czas wrocic do poczatkow tego tematu i wypowiedzi mowiacych o tworzeniu frameworka zeby byl wygodny dla Ciebie i ze tak naprawde MVC to jedynie koncepcja ktora kazdy realizuje po swojemu. Mam zamiar zbudowac kilka aplikacji na tym moim mini monstrum, jak pisal Hwao napewno wtedy wyjda bledy i inne koncepcje. Poki masz dane osobno tak ze mozesz wymieniac ich zrodlo z moze malutkimi zmianami kosmetycznymi, poki widoki i layouty pracuja w oddaleniu od logiki to chyba wszystko w porzadku bo jak sie nie myle podstawowa koncepcja MVC to odziel wizualnosc od funkcjonalnosci (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Ten post edytował thornag 25.08.2006, 12:51:05 |
|
|
![]()
Post
#29
|
|
Grupa: Przyjaciele php.pl Postów: 698 Pomógł: 3 Dołączył: 28.03.2004 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Żeby rozwiać wątpliwości - blueprints mvc. Sam w dyskusjach staram się nie używać słowa model - wydaje mi się trochę sztuczne... (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Wywołujemy akcje, dane pobieramy z bazy (poprzez DAO), operacje wykonujemy na danych. Wszystko to należy do modelu, a jednak można uniknąć tego słowa (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Potęga wzorców projektowych tkwi właśnie w tym, że nie są ograniczone implementacją (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Jedyne czego wymaga wzorzec MVC to oddzielenie warstwy prezentacji od logiki aplikacji i danych. To w jaki sposób to osiągniesz, to Twoja sprawa. Oczywiście w większości frameworków widujemy podobne implementacje wzorców Front Controller, Intercepting Filter itp... Jest to związane z praktycznością tych wzorców oraz ze ścisłym pozwiązaniem ich z MVC. |
|
|
![]()
Post
#30
|
|
Grupa: Zarejestrowani Postów: 1 873 Pomógł: 152 Dołączył: 9.04.2006 Skąd: Berlin Ostrzeżenie: (0%) ![]() ![]() |
@thornag: Masz racje. Każdy robi MVC tak jak chce (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) byle zrobic z tego MVC. (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Dla mnie to jest MVC. Przypomniałem sobie jak mam zrobione komentarze w swoim systemie. Musze przeklejac kod pobierania newsów (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) , a tu wywołam tylko akcje news setAction('news') ;P Wydaje mi się to super
@Ludvik: Masz całkowita racje. Już ktoś na początku podawał. Że samo include('moduly/'.$mod.'.php'); i tam masz pobieranie z bazy i smarty, to też MVC, tylko troszkę inne (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) |
|
|
![]() ![]() |
![]() |
Aktualny czas: 23.08.2025 - 12:48 |