![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 196 Pomógł: 2 Dołączył: 1.03.2006 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Ostatnio trochę czytałem na temat MVC i tak naprawdę tylko niektóre rzeczy z tego mi się podobają, nie wiem może jeszcze nie dostrzegam za wielu plusów, ale chce zastosować u siebie coś podobnego. Napisałem sobie klasę router i request, pierwsza pobiera dane z adresu, druga z formularzy, cookies, sesji i obsługuje dane z routera, klasę FrontController, które uruchamia moduł i tworzy instancję i klasę Action, uruchamia akcję (wywołuje metodę klasy). Kodowo wygląda to mniej więcej tak:
Jak powiecie czy to rozwiązanie jest optymalne, warto to dalej kodować, czy lepiej zabrać się za kodowanie 'standardowe' - z wprowadzaniem argumentów do funkcji itd.? |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 1 873 Pomógł: 152 Dołączył: 9.04.2006 Skąd: Berlin Ostrzeżenie: (0%) ![]() ![]() |
Wedługmnie prawie OK. Chodzi o to, że w FrontController powinieneś dać new Action(); $oAction->$_GET['action']() cos w tym stylu, żeby to kontroller uruchamiał akcję. Aha i jeszcze opłacałoby się przenieść z akcji __construct do np SubController, dać extends SubController a w SubController dać te zmienne z Kontrollerem
![]() -------------------- |
|
|
![]()
Post
#3
|
|
![]() Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%) ![]() ![]() |
Joachim: zakoduj to tak zeby przy tworzeniu serwisu na tym frameworku robilo sie to szybko (leniwie, niech robi jak najwiecej za ciebie, np. z ta akcja, po co masz to pisac za kazdym razem, niech to taki kontroller odpala) i przyjemnie i zebys za duzo kodu nie powtarzal
-------------------- Nie lubię jednorożców.
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 196 Pomógł: 2 Dołączył: 1.03.2006 Ostrzeżenie: (0%) ![]() ![]() |
Mówisz, żeby metodę wywoływać kontroler tylko co wtedy z klasą Action, która będzie pusta, no chyba, że dam dziedziczenie klasy FrontController z Action i w kontrolerze wywołać metodę z $this?
|
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 1 873 Pomógł: 152 Dołączył: 9.04.2006 Skąd: Berlin Ostrzeżenie: (0%) ![]() ![]() |
Dziedziczenie. O tym pisalem. Ja zrobiłem sobie osobne klasy Application_Action/Model/View gdzie mam __construct() { $this->oController = FrontController::getInstance(); coś w tym stylu
![]() -------------------- |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 196 Pomógł: 2 Dołączył: 1.03.2006 Ostrzeżenie: (0%) ![]() ![]() |
Zamotałem się strasznie
Wszystko się teraz rozjechało, bo są złe powiązania. Jakieś rady ? ![]() Ten post edytował Joachim Peters 31.08.2007, 09:43:06 |
|
|
![]()
Post
#7
|
|
![]() Grupa: Przyjaciele php.pl Postów: 698 Pomógł: 3 Dołączył: 28.03.2004 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Powiązania, jak sam zauważyłeś, są złe. Zacznijmy od tego, że Front Controller nie jest akcją - on wywołuje akcje, a to zupełnie inna relacja. Jeżeli chcesz podzielić działanie w stylu: moduł = klasa, akcja = metoda, to bym proponował stworzenie interfejsu modułu:
U Ciebie za moduł robił Sub Controller, ale nazwa Module wydaje się logiczniejsza moim zdaniem, szczególnie, że używasz jej w nazwie metody runModule(). Możesz pokusić się o stworzenie klasy abstrakcyjnej, albo zastąpić nią interfejs:
Front Controller jest ok, tylko usuń to dziedziczenie... Do tego bym odpalał obsługę żądania nie w konstruktorze, ale osobnej metodzie np. run(). -------------------- |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 196 Pomógł: 2 Dołączył: 1.03.2006 Ostrzeżenie: (0%) ![]() ![]() |
Teraz mam coś takiego:
i gdzie teraz wywołać tą akcję? |
|
|
![]()
Post
#9
|
|
![]() Grupa: Przyjaciele php.pl Postów: 698 Pomógł: 3 Dołączył: 28.03.2004 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Wywołanie akcji powinno być w metodze runModule kontrolera:
Następnie musisz utworzyć same akcje, które wywiedziesz z klasy AbstractModule:
Żeby wszystko uruchomić, musisz wywołać metodę run() FrontControllera. -------------------- |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 196 Pomógł: 2 Dołączył: 1.03.2006 Ostrzeżenie: (0%) ![]() ![]() |
Mam teraz taki kod:
i pokazuje błąd Fatal error: Argument 1 passed to AbstractModule::__construct() must be an object of class FrontController...on line 47 |
|
|
![]()
Post
#11
|
|
![]() Grupa: Przyjaciele php.pl Postów: 698 Pomógł: 3 Dołączył: 28.03.2004 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Trochę nie tędy droga. Zacznijmy od front kontrolera, który ma właściwości publiczne - powinny być prywatne.
Usunąłeś słowo kluczowe abstract z definicji klasy AbstractModule, która miała być abstrakcyjna. Nie możesz utworzyć instancji tej klasy, bo ona nic nie robi... Posiada tylko metodę runAction, która na podstawie nazwy akcji wywołuje odpowiednią metodę. Te metody musisz już napisać sam w klasie dziedziczącej AbstractModule. W przypadku tej konstrukcji, nie widzę sensu w podawaniu do konstruktora klasy modułu instancji front controllera. Na nic on nie jest potrzebny w tej klasie... Metoda runAction() w AbstractModule jest źle napisana - po co wyciągać obiekt modułu z front controllera? Przecież front controllera wywołuje tę metodę dla odpowiedniego modułu, dlatego runAction() operuje na składowych instancji, dla której została wywołana. Dlatego powinno być:
Warto wyrzucić do tego jakiś lepszy wyjątek, typu NoActionException. Komunikat nic Ci tak na prawdę nie daje w kodzie. Po typie wyjątku możesz już manipulować przechwytywaniem... Warto też do akcji jakoś przekazać obiekt żądania. -------------------- |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 196 Pomógł: 2 Dołączył: 1.03.2006 Ostrzeżenie: (0%) ![]() ![]() |
Mam teraz tak:
Pytanie i problemy: 1. Chciałbym jeszcze zrobić, żeby w module było można używać funkcji i danych z klasy request bez potrzeby tworzenia instancji w każdej z klas gdzie ma być to użyte. 2. Nie bardzo rozumiem, jaki sens jest w tworzeniu typu wyjątku takiego jaki podałeś? 3. Co teraz z szablonami? Chce użyć zwykłej składni PHP w HTML-u w plikach .php i czy robić do wczytywania tego jakąś osobną klasę czy w metodach modułów dawać po prostu include? 4. Czy jestem taki toporny czy mi się tylko wydaję? ![]() Ten post edytował Joachim Peters 31.08.2007, 15:55:27 |
|
|
![]()
Post
#13
|
|
![]() Grupa: Przyjaciele php.pl Postów: 698 Pomógł: 3 Dołączył: 28.03.2004 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
1. Przekaż instancję klasy HttpRequest do metody runAction, a z tej do metody wykonującej akcję.
2. Popatrz na wywołanie metody run Front Controllera. Jedyne co będziesz mógł zrobić z tymi wyjątkami, to wyrzucić je na ekran. Wyjątki powinny mieć takie typy, aby można było wywnioskować z kontekstu, czego one dotyczą. Jak jedna z Twoich akcji wyrzuci wyjątek, to nie będziesz wiedział, czy nie ma modułu, czy akcji, czy też akcja nie zrobiła czegoś źle. Komunikat na poziomie kodu źródłowego nic nie daje... 3. Zdecydowanie trzeba wyodrębnić widok, jeżeli chcesz, żeby miało to coś wspólnego z MVC. Najprostsze podejście, to zwrócenie nazwy szablonu z akcji i przekazanie jej do obiektu widoku, który dołączy odpowiedni szablon. 4. Bez przesady ![]() ![]() -------------------- |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 196 Pomógł: 2 Dołączył: 1.03.2006 Ostrzeżenie: (0%) ![]() ![]() |
c.d 2. Nadal nie za bardzo rozumiem, załóżmy, że mają wyrzucić się dwa wyjątki - puste, skąd mam wiedzieć co wtedy jest nie tak? Czy chodzi Ci o to, żebym dawał tyle klas wyjątków ile jest ich wystąpień, czyli do każdego zdarzenia inny wyjątek (z inną nazwą)?
c.d 3. Ok, mniej więcej wiem jakby to miało wyglądać tylko co jeżeli dana akcja będzie posiadała wiele widoków? Czy będzie trzeba składować cały kod widoku tej akcji w jednym pliku i później będzie od wczytywany podczas uruchamiania akcji ($view->get()) ? Ten post edytował Joachim Peters 31.08.2007, 18:29:55 |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 20.07.2025 - 07:17 |