Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> MVC raz jeszcze.
krzywy36
post
Post #1





Grupa: Zarejestrowani
Postów: 370
Pomógł: 43
Dołączył: 1.12.2007
Skąd: Kędzierzyn Koźle

Ostrzeżenie: (0%)
-----


Wiem, że jest masa tematów na forum o tematyce MVC ale chyba w żadnym nie ma zawartych wszystkich zasad/odpowiedzi.
Zabrałem się ostatnio za OOP i chciałem napisać coś większego, przy okazji sprawdzając wiedzę, ale stwierdziłem, że trzeba oprzeć to na jakimś ogólnym wzorcu - jak tworzyć podstrony, struktury katalogów itp. i wtedy zacząłem interesować się MVC, tak więc:

Struktura katalogów:
Kod
|core/
|controllers/
|models/
|views/
|classes/
|web/
|index.php


Po kolei:
W core znajdują się klasy: router, db, controller, model, view itp.
w controllers znajdują się klasy kontrolerów, dziedziczące po klasie controller (abstrakcyjna klasa controller to ogólny zarys kontrolera)
models to samo, czyli dziedziczace po klasie model
views - widoki wybierane w zaleznosci od akcji
classes - inne klasy, narazie nic tam nie ma,
web - skrypty js, style itp.
index.php - dołącza odpowiednie pliki i "zaczyna akcje"

?url = nazwaKontrolera/ akcja/ param1/ param2/ paramN...

Router parsuje url i się zaczynają problemy:
1. sam powinienem tworzyć obiekt kontrolera czy jakaś metoda routera (czy moze jeszcze innej klasy?) powinna to robić?
2. gdzie trzymać obiekt controllera? po prostu w zmiennej, czy moze w obiekcie innej klasy* za to odpowiedzialnej, jeśli to drugie to jak powinna działać ta klasa?
3. zakładając, że mam już utworzony obiekt kontrolera, wywołuje jakaś jego metode (akcja) - teraz jest tworzony obiekt widoku? jeśli tak to gdzie go trzymać, w kontrolerze, czy w obiekcie innej klasy*?
4. chcąc być zgodnym z koncepcją MVC, to widok powinien poprzez model pobierac dane, więc obiekt modelu powinien być tworzony i trzymany w widoku czy może wcześniej w kontrolerze?
5. potem widok wyświetla dane blablabla... hmm, to co tak właściwie robi kontroler? bo idąc moim tokiem myślenia (który jest prawdopodobnie błędny) tylko, tworzy i przechowuje widok?

*inna klasa - rejestr?

Próbowałem coś pisać ale się pogubiłem, więc zwracam się do was o pomoc, móglby ktoś napisać klarowne odpowiedzi na moje pytania? Ewentualnie opisać co konkretnie powinien robić kontroler, model, widok i jakie są zależności pomiędzy nimi (co do czego powinno mieć dostęp, co może modyfikować co itp.)

Wszystkie sugestie/rady/krytyka na temat czegokolwiek co tu napisałem - mile widziane (IMG:style_emoticons/default/snitch.gif)

Ten post edytował krzywy36 4.07.2010, 01:08:07
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Ad. 1) Router sam w sobie powinien być odpowiedzialny wyłącznie za przetwarzanie "wejściowego identyfikatora" (np. URLa) na zestaw konkretnych parametrów potrzebnych aplikacji do wywołania odpowiedniego kontrolera. W skrócie: na podstawie URLa ma zwrócić nazwę kontrolera i zestaw parametrów dla niego.
Ad. 2) Tutaj wiele zależy od tego w jaki sposób zaimplementujesz sam wzorzec. Bardzo często za wywołanie kontrolera odpowiedzialny jest tak zwany Dispatcher (na podstawie danych z Routera wywołuje odpowiedni kontroler) - co do jego działania - chyba wszystko jest jasne
Ad. 3) To kontroler jest odpowiedzialny za zainicjalizowanie obiektu Widoku, czego nie musi zawsze robić (przykładowo: gdy akcja kończy się wykonaniem przekierowania na inną stronę)
Ad. 4) Kontroler jest odpowiedzialny za wrzucenie odpowiedniego Modelu do danego Widoku. Widok sam w sobie powinien operować na Interfejsach, a nie konkretnych Modelach (tj. powinna istnieć możliwość wrzucenia dowolnego Modelu implementującego wymagany(e) przez Widok Interfejs(y))
Ad. 5) Bo Kontroler właściwie powinien robić względnie niewiele. On odpowiedzialny jest za zainicjalizowanie Modelu(i) oraz odpowiednego Widoku. Może jakoś skonfigurować Model (ma on do tego takie prawo jak i Widok). Na niego możesz zrzucić odpowiedzialność za takie "poboczne" rzeczy jak na przykład kontrola dostępu do danej części strony itp.

Cytat
Ewentualnie opisać co konkretnie powinien robić kontroler, model, widok i jakie są zależności pomiędzy nimi (co do czego powinno mieć dostęp, co może modyfikować co itp.)
Tutaj polecałbym Ci jakieś artykuły na temat MVC, ale nie ze świata PHP. Dlaczego? Bo jeszcze nie widziałem żadnej PHPowej implementacji tego wzorca, która by była chociaż ideologicznie zgodna z tym wzorcem. Dodatkowo poczytaj też o innych wzorcach, które wywiodły się z MVC, jak na przykład MVP (model-view-presenter), który bardzo często jest pokazywany (w mniejszym czy większym stopniu) jako MVC - nigdy nie zrozumiem czemu... oba skróty są fajne :] - czy hierarchicznej odmianie MVC - HMVC (również ciekawy wzorzec, który pasuje do środowiska webowego).

PS. Jest 4:13 - nie odpowiadam za to co napisałem (IMG:style_emoticons/default/smile.gif)

EDIT:
Odradzam też stosowanie wzorca Rejestru (przynajmniej dla "globalnego" zastosowania). Jest on wyjątkowo niewygodny (przykładowo: uniemożliwia rozpoznawanie typów obiektów przez różnego rodzaju IDE), ale przede wszystkim jest on niebezpieczny - pod indeks "controller" mógłbyś wrzucić dosłownie wszystko - a raczej powinna to być instancja obiektu Controller. Lepszym rozwiązaniem byłby tutaj Kontekst.

Ten post edytował Crozin 4.07.2010, 03:41:38
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 4.10.2025 - 15:48