![]() |
![]() ![]() |
![]() |
![]() ![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 1 429 Pomógł: 195 Dołączył: 6.10.2008 Skąd: Kraków/Tomaszów Lubelski Ostrzeżenie: (0%) ![]() ![]() |
Hey, mam pytania odnosnie MVC, zastanawiam sie czy kontroler i model ma dostep do widoku czy sam kontroler
http://athlan.pl/wp-content/uploads/mvc-model.png czy http://sysdm.googlecode.com/files/mvc.png Kolejne pytanie: jak wyglada struktura folderow takiej aplikacji? I czy jest zalezna od powyzszych zaleznosci pomiedzy widokiem a kontrolerem i modelem? I następne: takie proste sprawdzenie czy formularz zostal wyslany (nie chodzi o walidacje) czy nie ma byc obslugiwane w kontrolerze czy modelu? No to jeszcze jedno: mam ksiazeczke i tam jest takie cos jak router i dispatcher, ale oczywiscie jest tam 100 linijek kodu i zero zrozumialego opisu, moglby ktos wyjasnik do czego sluza? Nie sklamie jezeli powiem ze przelecialem juz wszystkie arty w naszym ukochanym polskim internecie ale procz zawilej teorii nie znalazlem odpowiedzi na te pytania, pozdrawiam -------------------- O! Zimniok :P
|
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 1 415 Pomógł: 117 Dołączył: 7.09.2005 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Router - tłumaczy dane wejściowe użytkownika - np. URL albo opcje z konsoli - i mapuje je na kontroler/akcję i parametry do wywołania.
Dispatcher - bierze te przetłumaczone dane i mapuje je na konkretne wywołanie klas/metod w systemie. To on w dużej mierze odpowiada za workflow. Teoretycznie podmieniając Dispatcher np. w takim ZF możesz sprawić, że akcje będą samodzielnymi klasami, a nie metodami klasy kontrolera. c.d. Jest jedna zasada - w żadnym wypadku model nie powinien nic wiedzieć o widoku. To dwa różne światy <kropka>. W drugą mańkę jest trochę inaczej - są jakby 2 szkoły. Jedna twierdzi, że widok też nie powinien mieć dostępu do samego modelu, a tylko do danych z niego pobranych. Druga, że to nic nie przeszkadza stąd np. twory a'la ModelAndView w Springu (Javowy framework). Nie podłączę się pod żaden z tych nurtów, bo zwyczajnie nie mam ochoty o tym dyskutować. Mogę jedynie stwierdzić, że im bardziej projektanci trzymają się czystego MVC (1-wsza szkoła) tym więcej pracy - duuużo więcej kodu - się z tym wiążę,a le jest to mniej elastyczne. Trzeba znaleźć złoty środek, albo kierować się głową przy doborze technologii do projektu. |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 1 429 Pomógł: 195 Dołączył: 6.10.2008 Skąd: Kraków/Tomaszów Lubelski Ostrzeżenie: (0%) ![]() ![]() |
Napisales jak goscie na kursach
![]() Czyli wg ciebie dobry jest schemat 2 ktory wyslalem? A jak z katalogami i ich zawartoscia? -------------------- O! Zimniok :P
|
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 1 415 Pomógł: 117 Dołączył: 7.09.2005 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Wg mnie 1-wszy lepiej oddaje sens MVC.
Co do katalogów to niewiele Ci powiem - przejrzyj Symfony, Agavi, ZF i np. Kohanę. Zobacz, które najlepiej Tobie pasuje etc. P.S. Popraw link w stopce. |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Co do różnych wariacji wzorca MVC: Temat: MVC Kontroler gdzie - jest sporo o tym jak ten MVC w "środowiskach webowych" wygląda/mógłby wyglądać.
Tutaj jest prosty i bardzo czytelny schemat działania MVC: http://upload.wikimedia.org/wikipedia/comm...llerDiagram.svg - w podlinkowanym wątku masz komentarz do tego obrazu. Cytat Napisales jak goscie na kursach nie wiele z tego zrozumialem, bez urazy :] No to jeszcze raz...Router W dużym skrócie: pobiera jakieś dane, przetwarza je i zwraca "surowe" dane uzyskane w procesie przetwarzania. Przykładowo taki router może rozpoznawać adresy URL i na ich podstawie określać co ma być wywołane (coś jak Apatche'owy moduł rewrite). Czyli router dostaje przykładowo dane: Temat: MVCKontroler Model Widok i na tej podstawie zwraca nam dane przykładowo: Kod controller: thread action: index lang: pl_PL params: id: 4868 Dispatcher Po edycji: Dispatcher zasadniczo odpowiedzialny jest za to by wywołać akcję (czyli korzystając z ReflectionAPI czy czegoś w stylu (niezbyt ładne)
EDIT: Jeszcze zapomniałem wspomnieć o strukturze katalogów. Generalnie to... jak Ci jest wygodniej. Warto tylko pamiętać by część danych była jednak jakoś rozdzielona. Czyli w miarę w jednym miejscu trzymasz sobie różne modele, gdzie indziej kontrolery, gdzie indziej jakieś biblioteki (chodzi o kod jakiś Doctrineów, Propelów, Swiftów, Symfonów, Zend Frameworków itp. itd.). Dobrze by też było by kod aplikacji był poza public_html - czyli w public_html trzymasz sobie jakieś obrazy, arkusze stylów, pliki JS. Trzymasz też jeden prosty plik PHP, który uruchamia całą aplikację - może on wyglądać nawet tak:
Ten post edytował Crozin 28.02.2010, 19:45:08 |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 1 429 Pomógł: 195 Dołączył: 6.10.2008 Skąd: Kraków/Tomaszów Lubelski Ostrzeżenie: (0%) ![]() ![]() |
no wlasnie, dazylem do stworzenia takiej aplikacji, ktora uruchamialbym w indexie tak jak pokazales Crozin, zwyklym wywolaniem jednej metody, jednak nie bardzo mi wychodzilo, bo musze jakos polaczyc ze soba config, widok, zeby dostep do bazy miala kazda klasa itp itp. no i zeby to mialo rece i nogi. W duzych aplikacjach MVC trzeba korzystac z routera i dispatchera?
-------------------- O! Zimniok :P
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 1 415 Pomógł: 117 Dołączył: 7.09.2005 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Crozin, jak dla mnie, pomieszałeś trochę dispatcher z front controllerem. Dispatcher nie robi tylu rzeczy, nie powinien.
Zasadniczo on ma tylko wywołać akcję. |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Cytat zeby dostep do bazy miala kazda klasa itp itp. I wtedy byś cały sens MVC poszedł by się...Cytat W duzych aplikacjach MVC trzeba korzystac z routera i dispatchera? I tak stworzysz coś co będzie pełniło rolę wspomnianego - może co najwyżej nie będzie to jawnie nazwane Routerem/Dispatcherem, ale będzie pełnić ich funkcje.@LBO: A rzeczywiście pomyliłem... (żeby nie było: przypadek :]). |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 1 429 Pomógł: 195 Dołączył: 6.10.2008 Skąd: Kraków/Tomaszów Lubelski Ostrzeżenie: (0%) ![]() ![]() |
zaczynam kumac, zaczalem czytac tematy, ktore zapodal Crozin i sie zastanawiam czy model ma generowac odpowiedni widok czy model ma zwracac wartosci do kontrolera, ktory to bedzie generowal widok?
I rozumiem ze role kontrolera moze pelnic kilka klas, jedna np, przy wysylaniu jednego formularza, inna drugiego, jeszcze inna przejecia jakiegos GET'a? -------------------- O! Zimniok :P
|
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 304 Pomógł: 51 Dołączył: 4.02.2005 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
I tak, i nie. Zazwyczaj we frameworkach jest tak, że jest jeden główny kontroler (FrontController), dyspozytor na podstawie parametrów routingu tworzy obiekt akcji (który też jest kontrolerem) i odpala jedną z metod tego obiektu.
-------------------- |
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 1 429 Pomógł: 195 Dołączył: 6.10.2008 Skąd: Kraków/Tomaszów Lubelski Ostrzeżenie: (0%) ![]() ![]() |
Cytat dyspozytor na podstawie parametrów routingu tworzy obiekt akcji (który też jest kontrolerem) Nie bardzo wiem o co chodzi z tym... a ten FrontController to ten guru, co wczytuje caly config (polaczenie z baza itp), jakos tak? -------------------- O! Zimniok :P
|
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarejestrowani Postów: 4 340 Pomógł: 542 Dołączył: 15.01.2006 Skąd: Olsztyn/Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Masz sobie link który wygląda powiedzmy tak.
Kod index.php?controller=users&action=edit&id=1 I dispatcher utworzy obiekt klasy users i wywoła metode edit z parametrem. To tak w wielkim skrócie.
Ten post edytował skowron-line 28.02.2010, 23:19:01 -------------------- I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy. QueryBuilder, Mootools.net, bbcradio1::MistaJam http://www.phpbench.com/ |
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 1 415 Pomógł: 117 Dołączył: 7.09.2005 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Tylko, żeby było jasne - to Router (a raczej różne klasy Routera trzymające się interfejsu Routera) tłumaczy URL
Kod index.php?controller=users&action=edit&id=1 lub pretty URL Kod /users/edit/1 lub nawet wywołanie z konsoli Kod --controller="users" --action="edit" --id=1 a dopiero z tego Routera Dispatcher pobiera wszelkie dane. Dispatcher też może posiadać swoje wyspecjalizowane klasy i tak jeden rodzaj Dispatchera wywoła akcję tak jak podał @skowron, a inny może wywołać:
|
|
|
![]()
Post
#14
|
|
![]() Grupa: Zarejestrowani Postów: 1 429 Pomógł: 195 Dołączył: 6.10.2008 Skąd: Kraków/Tomaszów Lubelski Ostrzeżenie: (0%) ![]() ![]() |
Rozumiem juz chyba jak wygladaja zaleznosci pomiedzy modelem, kontrolerem i widokiem, ale router i dispatcher... troche to zamotane, heh, macie moze jakas mala aplikacje napisana w MVC, (cos malego) jakis dobry kod do analizy? Niestety na necie cienko z tym. Najwiecej sie naucze analizujac kod. Pozdrawiam
-------------------- O! Zimniok :P
|
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 143 Pomógł: 19 Dołączył: 7.09.2009 Skąd: Rzeszów Ostrzeżenie: (0%) ![]() ![]() |
Np. obadaj sobie jka to wygląda w Kohanie www.kohanaphp.com
![]() Powodzenia |
|
|
![]()
Post
#16
|
|
![]() Grupa: Zarejestrowani Postów: 4 340 Pomógł: 542 Dołączył: 15.01.2006 Skąd: Olsztyn/Warszawa Ostrzeżenie: (0%) ![]() ![]() |
http://samuelsjoberg.com/archive/2007/01/url-dispatcher <- 3 wynik w guuglu.
-------------------- I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy. QueryBuilder, Mootools.net, bbcradio1::MistaJam http://www.phpbench.com/ |
|
|
![]()
Post
#17
|
|
![]() Grupa: Zarejestrowani Postów: 1 429 Pomógł: 195 Dołączył: 6.10.2008 Skąd: Kraków/Tomaszów Lubelski Ostrzeżenie: (0%) ![]() ![]() |
skomplikowana ta klasa dispatchera w tym co podałeś skowron-line, chyba puki co nie bede korzystal z routera/dispatchera, albo jak ktos gdzies wspomnial, bede korzystal nieswiadomie ;] pablo89pl, nie lubie frameworkow, nie lubie sobie ulatwiac w ten sposob zycia ;] To jak z jquery, mimo fajnych efektow, latwego uzycia, wole sie nauczyc od podstaw, czystego JS, a potem skorzystac z frameworkow, tak samo w PHP, choć nie wiem czy to jest podobnie z tym. Pozdro
-------------------- O! Zimniok :P
|
|
|
![]()
Post
#18
|
|
![]() Grupa: Zarejestrowani Postów: 1 415 Pomógł: 117 Dołączył: 7.09.2005 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Źle myślisz. zamiast uczyć się nowych technik i dobrych praktyk, będziesz się utrwalał w swoim programistycznym - zazwyczaj bardzo wąskim - światopoglądzie.
|
|
|
![]()
Post
#19
|
|
![]() Grupa: Zarejestrowani Postów: 1 429 Pomógł: 195 Dołączył: 6.10.2008 Skąd: Kraków/Tomaszów Lubelski Ostrzeżenie: (0%) ![]() ![]() |
Nie wiem jak rozwiazac problem, chce metoda __autoload pobrac wszystkie klasy tak aby byl dostep do ich obiektow z innych klas, jednak ta metoda magiczna uaktywnia sie przy wywolaniu obiektu,
tym sposobem pobierze klase z folderu kontrolerow ale potem zechce pobrac z modeli i wywali blad bo nie ma takiej samej klasy w folderze models co controllers, rozwiazalem to tym sposobem
No i moje pytanie, czy jest to poprawne? Mozna tak robic? Jezeli nie, to jakie jest lepsze wyjscie? Zgodnie z zalozeniem MVC musze miec dostep do klasy modeli z poziomu kontrolerow i do widoku z poziomu kontrolerow. -------------------- O! Zimniok :P
|
|
|
![]()
Post
#20
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
1) Sugerowałbym skorzystać z przestrzeni nazw, żeby mieć chociaż trochę porządku w nazewnictwie
2) Funkcja __autoload() jest uruchamiana za każdym razem gdy próbujesz użyć klasy, która nie istnieje. Więc każdorazowo powinieneś na podstawie jakiś tam kryteriów wczytać (o ile to potrzebne) z odpowiedniego katalogu plik z definicją klasy. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 19.08.2025 - 04:52 |