Zalążek frameworka z MVC, Proszę, zweryfikujcie moje podejście |
Zalążek frameworka z MVC, Proszę, zweryfikujcie moje podejście |
4.03.2006, 16:02:14
Post
#1
|
|
Grupa: Zarejestrowani Postów: 338 Pomógł: 2 Dołączył: 4.03.2006 Skąd: Łódź Ostrzeżenie: (0%) |
Witam wszystkich,
Ostatnio zacząłem czytać o obiektowym php5, MVC, frameworkach i postanowiłem zacząć pisać kod, który byłby dla mnie wygodny oraz co ważne - nadawał się do powtórnego wykorzystania. Opiszę to co do tej pory zrobiłem. Proszę Was, znaczniej bardziej doświadczonych programistów, o uwagi na temat mojego podejścia. Zaznacze, że swoją pracę oparłem do tej pory na artykule Frameworki z php.pl, framework CakePHP oraz o wypowiedzi forumowiczach w topikach MVC. Charakterystyka ogólna: Drzewo projektu Kod |- actions/ (tu wrzucam kontrolery w postaci class.NazwaKontrolera.php) |- conf/ |- models/ (tu będą modele, do tej pory nic tam nie mam) |- lib/ | +-- core/ - tu są moje pliki wykorzystywane w całej aplikacji | +-- class.Dispatcher.php | +-- class.Controller.php |- templates/ - szablony Smarty | |- index.php Oczywiście nie jest to finalny widok drzewa projektu. Ale nie to jest ważne. Jak działa mój framework? index.php uruchamia Dispatcher, który parsuje URL. Jeżeli następuje zgłoszenie index.php/Akcja1/Parametr1/Parametr2/, to dispatcher załącza kontroler Akcja1, a następnie kontroler tej akcji wywołuje na sobie (w zasadzie na potomku) metodę Parametr1 z parametrem Parametr2. Przykład: strona.pl/index.php/Uzytkownik/Pokaz/1234. Dispatcher przekaże kontrolę do kontrolera Uzytkownik. Ten natomiast włączy metodę Pokaz(1234); Generalnie wygląda to właśnie tak. Z tego co czytałem, to chyba całkiem logiczne rozwiązanie. Oczywiście mogę się mylić... Pliki
Będę Wam ogromnie wdzięczny za uwagi. Pozdrawiam serdecznie, Adrian. Ten post edytował Prph 4.03.2006, 19:40:41 |
|
|
4.03.2006, 18:07:56
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 597 Pomógł: 30 Dołączył: 19.02.2003 Skąd: Tychy Ostrzeżenie: (0%) |
Brak komentarzy, miales jakis pomysl, ale nie kazdy rozumie/nie ma czasu analizowac co dana metoda robi - toteż analiza ogólna pomysłu jest dość trudna.
Pozatym nie bardzo rozumiem Twoje nazewnictwo, z ktorego wynika, ze kontroler i akcja to jest to samo... wg. mnie kontroler powinien byc jeden i to on wywoluje odpowiednia akcje. Dla mnie tutaj kontrolerem jest klasa Dispatcher. Co do wyjątki w index.php, tutaj mi się wydaje, że lepiej zarejestrować globalny ( http://php.net/set_exception_handler ) . Pozatym zamiast count + for lepiej uzyc foreach Po co dajesz die? Skoro używasz wyjątków to się tego trzymaj. Wielu można funkcji użyc do sprawdzenia czy string jest pusty... ale wydaje mi się, że lepiej używać funkcji, które do tego służą.. czyli empty, a nie strlen. -------------------- Zapraszam na mój php blog, tworzenie stron.
|
|
|
4.03.2006, 18:56:02
Post
#3
|
|
Grupa: Zarejestrowani Postów: 362 Pomógł: 0 Dołączył: 18.02.2004 Skąd: Knurów Ostrzeżenie: (0%) |
Cytat(sf @ 2006-03-04 18:07:56) Pozatym nie bardzo rozumiem Twoje nazewnictwo, z ktorego wynika, ze kontroler i akcja to jest to samo... wg. mnie kontroler powinien byc jeden i to on wywoluje odpowiednia akcje. Dla mnie tutaj kontrolerem jest klasa Dispatcher. Akcja przy zastosowaniu wzorca MVC jest częścią kontrolera, natomiast sam Dispatcher jest częścią wzorca Front Controller (przynajmniej w tym kodzie, bo generalnie Front Controller powinien korzystać z Dispatchera w celu obsługi żądania, ale założenia są podobne). |
|
|
4.03.2006, 19:52:05
Post
#4
|
|
Grupa: Zarejestrowani Postów: 338 Pomógł: 2 Dołączył: 4.03.2006 Skąd: Łódź Ostrzeżenie: (0%) |
Diękują za uwagi.
Co do die() - faktycznie nie powinno go tam być. To dlatego, że wzorowałem się na CakePHP a tam było die() Wydaje mi się, że Kontroler to klasa danej akcji. To tak jakby moduł naszej aplikacji. Tzn jeżeli mamy akcję Użytkownik to wydaje mi się, że (nazwijmy je) podakcje typu PokażProfil, Usuń, Edytuj powinny być w tym kontrolerze Użytkownik, np:
Dlaczego Dispatcher? Dlatego, że był obecny w CakePHP. Nie wiem - nazwać go FrontController? Może faktycznie jest to lepszy pomysł. Z drugiej strony - przecież on rozbija URL i na podstawie tego odpala kontroler danej akcji. Czekam na dalsze uwagi. Pozdrawiam serdecznie, Adrian. |
|
|
4.03.2006, 19:58:25
Post
#5
|
|
Grupa: Zarejestrowani Postów: 691 Pomógł: 0 Dołączył: 19.01.2005 Skąd: Warszawa Ostrzeżenie: (0%) |
Ten pomysł z Dispatcherem mi się nie podoba.
Czemu nie zrobić tak, jak w większości frameworków? index.php/Kontroler/Akcja/Parametr/Parametr/...? -------------------- |
|
|
4.03.2006, 20:26:36
Post
#6
|
|
Grupa: Zarejestrowani Postów: 338 Pomógł: 2 Dołączył: 4.03.2006 Skąd: Łódź Ostrzeżenie: (0%) |
Ale przeciez w praktyce to tak działa
Ale chyba źle rozumiem pojęcie akcji i kontrolera. Może mi ktoś powiedzieć, co powinienem zmienić w swoim toku myślenia? Pozdrawiam, Adrian. |
|
|
4.03.2006, 20:51:50
Post
#7
|
|
Grupa: Zarejestrowani Postów: 362 Pomógł: 0 Dołączył: 18.02.2004 Skąd: Knurów Ostrzeżenie: (0%) |
We wzorcu MVC kontroler to część aplikacji odpowiedzialna za modyfikacje danych, pobiera on dane wprowadzane przez użytkownika, modyfikuje model i wymusza aktualizację widoku. Nie należy mylić kontrolera we wzorcu MVC z wzorcem Application Controller, bo ten drugi umiejscawia kontroler między modelem a widokiem, co nie jest zgodne z założeniami MVC.
Implementując kontroler w MVC mamy dwie drogi do wyboru: wzorzec Page Controller i Front Controller. Page Controller - dla każdej strony należącej do witryny tworzymy osobny kontroler. Dekoduje on dane wprowadzane przez użytkownika, tworzy obiekty modelu i wywołuje operacje na modelu, a następnie określa, którego widoku należy użyć i przekazuje mu informacje modelu. Raczej stosowany w aplikacjach o prostej logice działania. Front Controller - obsługuje wszystkie żądania przesyłane do witryny, a następnie tworzy obiekt polecenia abstrakcyjnego, który następnie wykonuje (można je nazwać akcjami). Traktuje on polecenia jako klasy, a nie strony jak to jest w przypadku wzorca Page Controller. Często łączony z wzorecem Intercepting Filter, bardziej złożony od wzorca Page Controller, ale również bardziej elastyczny. Pozostaje jeszcze wzorzec Application Controller, ale to już nieco inna bajka Jaki wzorzec zastosujesz - to zależy od ciebie. Ja mogę polecić lekturę PoEAA i POSA |
|
|
5.03.2006, 09:12:40
Post
#8
|
|
Grupa: Moderatorzy Postów: 1 566 Pomógł: 37 Dołączył: 14.05.2003 Skąd: Kraków |
Ja sobie podzieliłem to tak:
Kod framework - Web - Services - ActionChain - Controller - FrontController - Sockets - Request Idzie to tak: Request pobiera dane z urla o akcji. Odpalany jest Controller, który ładuje bloki menu. Controller odpala FrontController, który znowu korzysta z ActionChain. ActionChain ładuje plik xml z dostępnymi akcjami. Co do parsowania urla. Stwórz obsługę filtrów, i tam wsadź sobie URLFilter. pozdrawiam |
|
|
5.03.2006, 10:14:11
Post
#9
|
|
Grupa: Zarejestrowani Postów: 338 Pomógł: 2 Dołączył: 4.03.2006 Skąd: Łódź Ostrzeżenie: (0%) |
Teraz raz jeszcze przeczytalem Wprowadzenie do MVC z portalu. Patrzac na Twoje rozwiazanie i idee przedstawione w artykule stwierdzam, ze juz zupelnie mvc nie rozumiem
Mozesz przedstawic zarys Twojej aplikacji - napisz jakie klasy, metody i co robia. Kodu nie potrzebuje. Kolejna sprawa... Przeczytalem ze Kontroler wlacza widok a on wywoluje model. Jakos nie rozumiem :/ Jak widok ma wywylac metode? Widok to obiekt? A jak na koncu wyswietlane sa dane? Pozdrawiam, Adrian. |
|
|
5.03.2006, 10:24:42
Post
#10
|
|
Developer Grupa: Moderatorzy Postów: 2 844 Pomógł: 20 Dołączył: 25.11.2003 Skąd: Olkusz |
W ogole brak Ci widoku w tym frameworku.
Glupio jest troche to wszytko skladac w php poniewaz calosc nie dziala w trybie "ciaglym" tylko jest odpalana po requestach, wiec moze sie okazac ze czesc zalozen MVC wogole nie pasuje do zastosowana WEB'owych. Dlatego ciezko moim zdaniem jest znalesc kompromis miedzy paroma czynnikami, ilosc klas, modele, akcje, kontroler, widok i szybkosc pisania(ze nie pisze sie 'nie potrzebnych klas' - chociaz roznie z tym nie potrzebnym jest, to zalezy od tego jakiego framework'a potrzebujesz) |
|
|
5.03.2006, 10:51:08
Post
#11
|
|
Grupa: Zarejestrowani Postów: 362 Pomógł: 0 Dołączył: 18.02.2004 Skąd: Knurów Ostrzeżenie: (0%) |
U mnie to wygląda tak:
index.php: W tym pliku tworzone są obiekty HttpRequest i HttpResponse (ktore następnie dodaje do kontenera HttpContext dla ułatwienia). Następnie tworzony jest obiekt FrontController i wywoływana jest jego metoda processRequest( iHttpRequest $Request, iHttpResponse $Response); Oczywiście wszystkie metody tutaj zawarte można umieścić w obiekcie ApplicationBootstrap, albo czymś podobnym. FrontController.class.php: Metoda processRequest tworzy obiekt RequestHelper (patrz niżej). Po pobraniu od RequestHelpera polecenia, FrontController wywołuje metodę processCommand( iCommand $Command). Metoda ta tworzy nowy obiekt FilterManager. A następnie rejestruje w nim kolejne filtry, jednym z nich jest ExecutionFilter, który przyjmuje jako parametr polecenia do wykonania. RequestHelper.class.php: Klasa ta udostępnia metodę getCommand. Tworzony jest obiekt CommandFactory i RequestDispatcher. Wywoływana jest metoda CommandFactory->createCommand, która przyjmuje zwracane przez RequestDispatcher nazwę modułu i nazwę polecenia. ExecutionFilter.class.php: Klasa ta jest wykonywana przez FilterManager. Wywołuję na poleceniu (Command) metodę execute(), następnie tworzy obiekt ViewFactory, który na podstawie danych dostarczonych przez obiekt Command tworzy nowy widok. Operacje zawarte w obiekcie widoku są wykonywane, następnie dane zwrócone przez widok przekazywane są obiektowy HttpResponse. Sama przykładowe polecenie wygląda tak:
A widok MessageView tak:
Nie jest to może najprostsze rozwiązanie, ale myślę, że jest poprawne w duchu MVC. Ten post edytował matid 5.03.2006, 10:52:21 |
|
|
5.03.2006, 16:47:05
Post
#12
|
|
Grupa: Zarejestrowani Postów: 338 Pomógł: 2 Dołączył: 4.03.2006 Skąd: Łódź Ostrzeżenie: (0%) |
Witam
Widzę, że niechętnie podchodzicie do mojej prośby Ok, to spróbuję inaczej. Znalazłem pewnien artykuł o budowie frameworka z wykorzystaniem MVC. Troche z niego wyciągnąłem Prosze mi jednak opisać, co powinno wydarzyć się w przypadku zgłoszenia rządania HTTP. Proszę podać co jest klasą, co zwykłą metodą. Co klasa robi itp Np: Rządanie obsługuje Kontroler (klasa). Rozbija URI, mapuje (domyślam się, że chodzi tu kojarzenie akcji z URI z klasą akcji) itd... Pozdrawiam, Adrian. Ten post edytował Prph 6.03.2006, 15:59:08 |
|
|
7.03.2006, 14:59:34
Post
#13
|
|
Grupa: Moderatorzy Postów: 1 566 Pomógł: 37 Dołączył: 14.05.2003 Skąd: Kraków |
Widze, że czekasz aż ktoś rzuci kodem.
To jak zbudowana jest aplikcja, zależy od Ciebie. Możesz mieć tak:
Możesz mieć jeszcze inaczej... |
|
|
9.03.2006, 23:24:05
Post
#14
|
|
Grupa: Zarejestrowani Postów: 338 Pomógł: 2 Dołączył: 4.03.2006 Skąd: Łódź Ostrzeżenie: (0%) |
Przejrzałem kod Phienda, poczytałem dokumentacje, znowu przejrzałem pół Internetu i napisalem zupełnie od nowa framework. Ma jeszcze kupe błędów, jest mało spójny, ale mam wrażenie, że ogólne założenie udało mi się zrealizować.
Ale zastanawiam się teraz, jak zrealizować łańcuchy akcji. Może jakieś sugestie? |
|
|
10.03.2006, 06:48:18
Post
#15
|
|
Developer Grupa: Moderatorzy Postów: 2 844 Pomógł: 20 Dołączył: 25.11.2003 Skąd: Olkusz |
czemu u Ciebie akcja wlacza Model i Widok?
Przy takim zalozeniu nie potrzebny Ci chyba lancuch ackji |
|
|
10.03.2006, 07:54:17
Post
#16
|
|
Grupa: Zarejestrowani Postów: 338 Pomógł: 2 Dołączył: 4.03.2006 Skąd: Łódź Ostrzeżenie: (0%) |
Yyyyy? A to co ma włączać model i widok?
Ludzie czym do ... jest akcja? Bo dla mnie to ona jest jak kontroler - zwyczajnie steruje.
To nie jest poprawne rozwiązanie? I czy ono kłuci się z MVC? |
|
|
10.03.2006, 09:03:36
Post
#17
|
|
Grupa: Zarejestrowani Postów: 1 597 Pomógł: 30 Dołączył: 19.02.2003 Skąd: Tychy Ostrzeżenie: (0%) |
Hyh, w ostatnim php Solutions jest fajnie napisane o frameworku. Wladowali tam kupe przykladowych wzorcow. Polecam.
-------------------- Zapraszam na mój php blog, tworzenie stron.
|
|
|
10.03.2006, 09:09:42
Post
#18
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) |
Cytat(Prph @ 2006-03-10 07:54:17) Yyyyy? A to co ma włączać model i widok? Ludzie czym do ... jest akcja? Bo dla mnie to ona jest jak kontroler - zwyczajnie steruje. Błąd. Mylisz pojęcia i znaczenia. Do sterowania jest kontroler, to on na podstawie żądania uruchamia akcję. A ona ma za zadanie tylko i wyłącznie wykonać jakąś operację i kropka. Akcja niczym nie steruje. |
|
|
10.03.2006, 12:28:05
Post
#19
|
|
Grupa: Zablokowani Postów: 167 Pomógł: 2 Dołączył: 15.02.2004 Ostrzeżenie: (30%) |
Cytat(mike_mech @ 2006-03-10 10:09:42) Hyh, w ostatnim php Solutions jest fajnie napisane o frameworku. Wladowali tam kupe przykladowych wzorcow. (...) Mylisz pojęcia i znaczenia. Do sterowania jest kontroler, to on na podstawie żądania uruchamia akcję. Mam ten artykuł z php Solutions. Jest dobry, ale nic nie mówi o najważniejszym dla nas w tym przypadku wzorcu: MVC. Ja również w innym wątku nie mogłem się doprosić wyjaśnienia co to jest akcja i za co opowiada! Wzorzec MVC mówi o modelu, widoku i kontrolerze. Teoretycznie w tym wzorcu nie ma mowy o akcji... Kod $kontroler = new KontrolerMVC(); $model = new ModelMVC(); $widok = new WidokMVC(); $kontroler->wybierzModel($_GET['model']); $widok->dane($model->pobierz()); $widok->wyswietl($model->widok()); To rozwiązanie jest dobre dla jednej operacji (akcji). Jednak jak powinna wyglądać implementacja tego wzorca w przypadku wielu akcji do realizacji? Taki przykład. Do realizacji jest: - zapisanie danych z formularza - wyświetlenie właściwego komunikatu (czy powiodło się?) - pobranie danych do wyświetlenia na stronie Mamy 3 operacje. Jak powinna teraz wyglądać implementacja tego wzorca. Tylko proszę nie odsyłać mnie do żadnego frameworka. Widziałem już dziesiątki przykładów, jednak żaden nie trzymał się zasad wzorca MVC. |
|
|
10.03.2006, 14:51:59
Post
#20
|
|
Grupa: Zarejestrowani Postów: 521 Pomógł: 0 Dołączył: 3.11.2003 Skąd: 3city Ostrzeżenie: (0%) |
Żaden nie trzymał się zasad wzorca MVC? Bo to zależy, jak autor danego frameworka interpretuje te zasady. Jakby było to takie oczywiste, to by był tylko jeden framework i koniec dyskusji. Zamiast tego masz wiele frameworków, i jeszcze więcej koncepcji implementacji tego wzorca. Więc nie pytaj "czy to jest zgodne z MVC", tylko "dlaczego to jest zrobione tak, a nie inaczej". I dlaczego to, że jakiś framework nie trzyma się zasad MVC, jest wadą?
Ale wracając do twojego przykładu: 1. Na początku będzie jakaś implementacja kontrolera, pewnie FrontController, która w jakiś sposób dojdzie do wniosku, którą akcję chce wykonać. 2. Akcja pobierze dane z formularza (albo bezpośrednio z $_POST, albo z jakiegoś HttpRequesta, albo jeszcze inaczej), stworzy odpowiedni obiekt warstwy modelu i za jego pomocą wykona update 3. Teraz albo akcja oddaje sterowanie do kontrolera, który dochodzi do wniosku, że należy wykonać odpowiedni widok, lub akcja sama odpala potrzebny widok. 4. Widok wypluwa HTMLa. Muszę się też przyczepić do modelu. Po prostu szał mnie bierze, kiedy widzę $model = new Model(). Model to jest warstwa, a nie klasa. Rysujesz sobie, co aplikacja ma robić, i tworzysz z tego ładny diagram klas, bez żadnego HTTP, HTML, kontrolerów, akcji i całego tego balastu. |
|
|
Wersja Lo-Fi | Aktualny czas: 25.04.2024 - 06:58 |