Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [MVC]Kontroler-Model-Widok, Kilka pytan
MateuszS
post
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
Go to the top of the page
+Quote Post
LBO
post
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.
Go to the top of the page
+Quote Post
MateuszS
post
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 biggrin.gif nie wiele z tego zrozumialem, bez urazy :]

Czyli wg ciebie dobry jest schemat 2 ktory wyslalem? A jak z katalogami i ich zawartoscia?


--------------------
O! Zimniok :P
Go to the top of the page
+Quote Post
LBO
post
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.
Go to the top of the page
+Quote Post
Crozin
post
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)
  1. $controller = 'Abc'; $action = 'Def';
  2. $c = new $controller();
  3. $c->$action();


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:
  1. <?
  2.  
  3. require_once '..........';
  4.  
  5. $dispatcher = new \MyProject\Dispatcher();
  6. $dispatcher->run();



Ten post edytował Crozin 28.02.2010, 19:45:08
Go to the top of the page
+Quote Post
MateuszS
post
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
Go to the top of the page
+Quote Post
LBO
post
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ę.
Go to the top of the page
+Quote Post
Crozin
post
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 :]).
Go to the top of the page
+Quote Post
MateuszS
post
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
Go to the top of the page
+Quote Post
-=Peter=-
post
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.


--------------------
Go to the top of the page
+Quote Post
MateuszS
post
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
Go to the top of the page
+Quote Post
skowron-line
post
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.

  1. class users {
  2. public function edit($id)
  3. {
  4. //
  5. }
  6. }


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/
Go to the top of the page
+Quote Post
LBO
post
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ć:

  1. /**
  2.  * Klasa edit w folderze "users"
  3.  */
  4. class Edit extend Action
  5. {
  6. public function execute()
  7. {
  8. $id = $this->getParameter('id');
  9. // reszta
  10. }
  11. }
Go to the top of the page
+Quote Post
MateuszS
post
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
Go to the top of the page
+Quote Post
pablo89pl
post
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 smile.gif
Powodzenia
Go to the top of the page
+Quote Post
skowron-line
post
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/
Go to the top of the page
+Quote Post
MateuszS
post
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
Go to the top of the page
+Quote Post
LBO
post
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.
Go to the top of the page
+Quote Post
MateuszS
post
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,

  1. function __autoload($filename) {
  2. require_once(CONTROLLERS . $filename . FCLASS);
  3. require_once(MODELS . $filename . FCLASS);
  4. require_once(VIEW . $filename . FCLASS);
  5. }
  6. $ob = new homePage;


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

  1. function __autoload($filename) {
  2. if(require_once(CONTROLLERS . $filename . FCLASS)) return true;
  3. if(require_once(MODELS . $filename . FCLASS)) return true;
  4. if(require_once(VIEW . $filename . FCLASS)) return true;
  5. }


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
Go to the top of the page
+Quote Post
Crozin
post
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.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 19.08.2025 - 04:52