![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 59 Pomógł: 6 Dołączył: 9.04.2007 Skąd: Szczecin Ostrzeżenie: (0%) ![]() ![]() |
Hej!
W celu lepszego zrozumienia idei MVC postanowiłem troszkę się pobawić i korzystając z wielu dostępnych mi źródeł napisać coś na wzór pseudo-MVC-frameworka. Mam jednak parę pytań, z czego najważniejsze to czy to się w ogóle trzyma kupy? Autoloader wygląda następująco: Mam taki pseudo "front Controller", który ma za zadanie odpalenie odpowiedniego kontrolera na podstawie $_SERVER['request'] i wygląda on tak: Klasa Controller, po której dziedziczy każdy kontroler wygląda natomiast tak A klasa Template, która odpowiada za wczytanie i wyrenderowanie odpowiedniej templatki (jest dość primitywna)
Jeśli komukolwiek udało się przebrnąć przez te linijki kodu mam 3 pytania: a) Czy udało mi się uchwycić ideę OOP (IMG:style_emoticons/default/cool.gif) Czy udało mi się uchwycić ideę MVC c) Co mogę poprawić, żeby kod był bardziej OOP/MVC. Przepraszam za chaotyczność (?) tego postu ale mam grypę i logiczne myślenie jest ciężkawe :<. Pozdrawiam i z góry dzięki, Vielta |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
O kur... co to za autoloader.
Poczytaj o include_path Dlaczego pytacie się "czy robię zgodnie z OOP, co mogę zrobić by było bardziej OOP"? W pani domu wyczytaliście, że jest moda na skrót OOP? Główną zasadą projektowania klas w OOP jest odpowiedzenie sobie na pytanie "Co mi da wprowadzenie obiektu? Czy łatwo mogę rozszerzyć możliwości klasy? Jakie ograniczenia sobie stwarzam?" i w myśl tego projektować. Mniej więcej załapałeś o co chodzi, brakuje mi silnego typu argumentów http://pl2.php.net/manual/pl/language.oop5.typehinting.php Brakuje również phpdoca o którym mam nadzieję będziesz pamiętać. |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 59 Pomógł: 6 Dołączył: 9.04.2007 Skąd: Szczecin Ostrzeżenie: (0%) ![]() ![]() |
Nie wiem jak ty ale ja pani domu nie czytam ;P (wolę sekrety serca!)
O Phpdoc z reguły pamiętam, teraz nie używałem bo pisałem to tylko i wyłącznie w celach edukacyjnych. W sumie fakt, powinienem dodać jak wrzucałem na forum, mea culpa. Cytat Co mi da wprowadzenie obiektu? Czy łatwo mogę rozszerzyć możliwości klasy? Jakie ograniczenia sobie stwarzam? Odpowiedziałem sobie na te pytania, co mi to daje? Brak konieczności powtarzania niektórych bloków kodu, oddzielone od siebie wszystko co związane z bazą/widok/logika. W sumie mogę łatwo rozszerzyć ale nie jestem pewien do jednego, [u]nie przemawia do mnie motyw tego, że żeby odwołać się do Template muszę to robić przez Controller.Średnio widzę miejsce gdzie Type Hinting mógł bym użyć Ten post edytował Vielta 8.09.2010, 14:38:06 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Piszesz o MVC, a tymczasem w kodzie jest jedynie podstawa kontrolera (który nie wiadomo czemu ma mieć jeden model, referencję do innego kontrolera (wtf?) i narzucony jakiś szablon). Gdzie jest reszta (tj. Widok/Model), gdzie jakiś przykład finalnego zastosowania?
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 59 Pomógł: 6 Dołączył: 9.04.2007 Skąd: Szczecin Ostrzeżenie: (0%) ![]() ![]() |
To z modelem zmieniłem chwilę po wrzuceniu posta na forum, faktycznie było to dość głupie.
To frontcontroller to po prostu taka nazwa, w sumie dispatcher pasowało by lepiej, z założenia była to po prostu klasa, która zajmuje się requestem i uruchamia odpowiedni controller. A jak wg. Ciebie powinno to wyglądać? Szablon powinienem sam ustalać osobno dla każdego kontrolera? Nie lepiej dać tak jak tutaj szablon zależny od kontrolera z nazwą z góry ustaloną? Klasę widoku podałem przecież w 1. poście a klasa model jest póki co na tyle mało rozwinięta, że pewnie wrócę z nią tutaj za parę dni gdy skończę pisać. @wookieb Ten autoloader powinien tak wyglądać mniej więcej?
Ten post edytował Vielta 8.09.2010, 17:33:20 |
|
|
![]()
Post
#6
|
|
Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
Nie wiem po co Ci funkcja add_include_path. Ogólnie dobrze ale wystarczy, że użyjesz http://pl2.php.net/manual/pl/function.set-include-path.php
TYPE HINT zdecydowanie możesz użyć w metodach gdzie wymogiem jest przekazanie obiektu. Np w twoim addTemplateHelper. |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 59 Pomógł: 6 Dołączył: 9.04.2007 Skąd: Szczecin Ostrzeżenie: (0%) ![]() ![]() |
add_include_path to funkcja z tego linku, który podałeś co bym się nie pogubił dodając te ~5 ścieżek (IMG:style_emoticons/default/tongue.gif)
Co jeszcze powinienem poprawić/nad czym pomyśleć? |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Cytat A jak wg. Ciebie powinno to wyglądać? Wybacz, nie chce mi się n-ty raz pisać o MVC.Cytat Klasę widoku podałem przecież w 1. poście W takim razie wróć do teorii tego wzorca - widok nie ma nic wspólnego z szablonem - może go co najwyżej na samym końcu odpalić, jeżeli zajdzie taka potrzeba.Cytat TYPE HINT zdecydowanie możesz użyć w metodach gdzie wymogiem jest przekazanie obiektu. Np w twoim addTemplateHelper. Przecież w PHP nie da się go nigdzie indziej użyć (no... tam jeszcze tablice, ale to śmiechu warte jest :])
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 450 Pomógł: 84 Dołączył: 27.11.2008 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Trochę dziwnie na moje oko rozwiązałeś sprawę front controllera, ja u siebie mam zadania routingu/walidacji rozbite na dwie klasy - router oraz dispatcher. Dla tej pierwszej przekazuje w argumencie query string i po wykonaniu dostaje od niej ostateczne dane. Tworzenie obiektu i wywoływanie akcji zrzucam właśnie na klasę front controller. W nim tworzę obiekt dispatcher-a i on sprawdza czy żądany kontroler/akcja istnieje (oraz czy jest poprawny - przydaje się tutaj ReflectionClass) jeżeli tak załącza odpowiedni plik i po utworzeniu obiektu kontrolera odpalamy akcję. Co do autoloader-a to ja to rozwiązałem w ten sposób, że nazwy klas zapisywane są w stylu "underscore", bardziej po zendowsku (IMG:style_emoticons/default/biggrin.gif) Przykładowo z ciągu af_Database_Interface_QueryBuilder usuwam prefix "af" i podkreślniki zamieniam na ukośniki, konwertuje na małe znaki i dostaję ścieżkę "/database/interface/querybuilder". W taki sposób autoloader elegancko odnajduje sobie poprawną ścieżkę. Oczywiście nie musisz robić tego w sposób jaki podałem. Luźne sugestie (IMG:style_emoticons/default/winksmiley.jpg)
pozdrawiam edit: Cytat Cytat TYPE HINT zdecydowanie możesz użyć w metodach gdzie wymogiem jest przekazanie obiektu. Np w twoim addTemplateHelper. Przecież w PHP nie da się go nigdzie indziej użyć (no... tam jeszcze tablice, ale to śmiechu warte jest :]) urok tego języka (IMG:style_emoticons/default/biggrin.gif) nie ma to jak dodać obsługę dla obiektów/tablic i zapomnieć o reszcie Ten post edytował Quantum 8.09.2010, 18:40:18 |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 59 Pomógł: 6 Dołączył: 9.04.2007 Skąd: Szczecin Ostrzeżenie: (0%) ![]() ![]() |
@Crozin
Nie no spoko, wiem, że ten temat jest poruszany codziennie około 10x na forum (IMG:style_emoticons/default/tongue.gif) W takim razie średnio zrozumiałem co to jest widom, sądziłem, że widok = szablon. |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Nie sądzisz, że jeżeli by tak było to by się to nazywało... szablonem nie widokiem? Widok to przede wszystkim logika aplikacji - a szablon - to już ostatni etap tej warstwy (nie zawsze konieczny).
|
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 59 Pomógł: 6 Dołączył: 9.04.2007 Skąd: Szczecin Ostrzeżenie: (0%) ![]() ![]() |
Zapewne tak by się nazywało. Odpowiedz mi tylko na 1 pytanie jeśli możesz. Do modelu odwołuje się kontroler czy widok?
|
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
I jedno i drugie - jednak z dużym naciskiem na to ostatnie.
|
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 59 Pomógł: 6 Dołączył: 9.04.2007 Skąd: Szczecin Ostrzeżenie: (0%) ![]() ![]() |
A już miałem nadzieję, że zrozumiałem o co chodzi z widokiem.
user wchodzi na stronę -> dispatcher dostaje URL i ładuje odpowiedni controller i jego odpowiednią akcję/metodę -> w metodzie uruchamiamy odpowiedni widok (i/lub model) -> widok wykorzystuje model tylko i wyłącznie w celu pobierania danych a controller dodawania/edytowania. Tak to wygląda?:< |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 450 Pomógł: 84 Dołączył: 27.11.2008 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
w kontrolerze tworzysz widok i do nich przypisujesz nieograniczoną ilość modeli, dam Ci przykład z mojego frameworka (przykład pisany na szybko):
W tym przypadku można było użyć active record, ale tak było prościej wytłumaczyć jak to powinno wyglądać. W widoku możesz teraz sobie pobierać konkretne dane, które chciałbyś wyświetlić, tutaj raczej nie jest to potrzebne, ale ogólnie to tak to działa (IMG:style_emoticons/default/smile.gif) pozdrawiam. Ten post edytował Quantum 9.09.2010, 17:47:37 |
|
|
![]()
Post
#17
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
@Quantum: Mógłbyś pokazać jakąś przykładową implementację widoków/modeli? Bo przy takim interfejsie nie potrafię sobie wyobrazić jak chcesz zrealizować założenia tego wzorca.
|
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 450 Pomógł: 84 Dołączył: 27.11.2008 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
hmm, a mógłbyś sprecyzować ? co mogłoby przeszkodzić w realizacji tegoż wzorca w takim interfejsie (poza logicznymi ograniczeniami protokołu) ? fw jest dość "świeży" więc możliwe, że czegoś nie przemyślałem, ale ogólnie starałem się przenieść fajne rozwiązania z innych i stworzyć wygodny przynajmniej dla mnie w użyciu (IMG:style_emoticons/default/smile.gif)
model jest w tym momencie bardzo prosty, ale w przyszłości myślałem nad stworzeniem klasy af_Model, po której bym dziedziczył, a jej konstruktor przypisywałby żądane w modelu abstrakcje dostępu do danych, moja koncepcja:
Ten post edytował Quantum 9.09.2010, 15:18:43 |
|
|
![]()
Post
#19
|
|
Grupa: Zarejestrowani Postów: 59 Pomógł: 6 Dołączył: 9.04.2007 Skąd: Szczecin Ostrzeżenie: (0%) ![]() ![]() |
Teraz to mi namieszaliście (IMG:style_emoticons/default/biggrin.gif)
Wg. Quantum'a do modelu odwołuję się w plikach template a wg. Crozin'a odwołuję się w osobnych klasach dla każdego widoku. |
|
|
![]()
Post
#20
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
@Vielta: Quantum potraktował wartstwę widoku jako synonim szablonu, przez co utracił cały sens MVC - czyt.: to co podał nie ma zbyt wiele wspólnego w z MVC.
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 23.08.2025 - 06:59 |