![]() |
![]() |
![]() ![]()
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 |
|
|
![]() |
![]()
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 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 4.10.2025 - 15:48 |