Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php] Kontroler od podstaw, jak zacząć?
Beynar
post
Post #1





Grupa: Zarejestrowani
Postów: 60
Pomógł: 1
Dołączył: 6.12.2007

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


Nie wiem od czego zacząć pisac mój pierwszy kontroler. Wiem, że musze zacząć od front kontrolera ale nie moge załapać, jak zacząć, co on ma robić i jak dalej ma przekazywać żadania, akcje i gdzie je w końcu wywoływać. Jak ma to wszystko działać i z czym to się je.
Googlowałem, szukałem na forum, czytałem ale dalej mam wiele wątpliwości.
Z tego co rozumiem to front controller ma za zadanie tylko wyciąganie akcji z adresu, i uzyskiwanie odpowiedniej formy żądania? tzn. np utowrzenie tablicy z poszczegolnymi parametrami żadania ze stringu.
Np. z http://.../index.php?mod=newsy&pokaz=34&parametry=23;56;21
nasz FC ma za zadanie tylko uzyskanie odpowiedniej formy, np. tablicy i przekazanie akcji dalej... ale gdzie dalej i jak...?

Jestem początkującym programistą więc proszę o proste tłumaczenie i wyrozumiałość smile.gif

pozdrawiam
Go to the top of the page
+Quote Post
nrm
post
Post #2





Grupa: Zarejestrowani
Postów: 627
Pomógł: 33
Dołączył: 1.05.2005
Skąd: Katowice

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


dużo się nauczysz przeglądając klasy i opis do nich z Zend pseudo Frameworka.


--------------------
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #3





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Front Controller to wzorzec projektowy i robi tyle, ile chcesz aby robił. Jeśli jak mówisz, jesteś początkujący, to obejrzyj stronę
http://martinfowler.com/eaaCatalog/

Wzorzec, o którym rozmawiamy, to http://martinfowler.com/eaaCatalog/frontController.html
Jest on punktem wejścia dla każdego żądania. Określa, jaka komenda zostanie uruchomiona, uruchamia wszelkie globalne walidatory, określa kontekst żądania. To nie znaczy, że ma wiedzieć, jak się to odbywa, bo najczęściej zleca to innym obiektom przekazując potrzebne informacje, a on je jedynie... kontroluje

Pozdrawiam.


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
Beynar
post
Post #4





Grupa: Zarejestrowani
Postów: 60
Pomógł: 1
Dołączył: 6.12.2007

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


Przeglądam Zend Frameworka... przeglądałem cake php i code codeIgniter...
ich kontrolery są ogromne, rozubodowane... myślę, że zdecydowanie za duze jak na moje projekty.

Dalej nie wiem od czego zaczac... :/
Go to the top of the page
+Quote Post
mike
post
Post #5





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Cytat(Beynar @ 13.01.2008, 17:59:55 ) *
Dalej nie wiem od czego zaczac... :/
Zacznij od teorii wzorców.
Pierwszy trop dostałeś od ~Cysiaczka. Jest tam kilka słów tytułem wstępu.

Bardzo obszerny artykuł (najlepszy jaki widziałem) o tym wzorcu przeczytasz tutaj: Core J2EE Patterns - Front Controller.
Bez znajomości teorii wzorców projektowych nie masz co podchodzić do tematu.
Go to the top of the page
+Quote Post
carbolymer
post
Post #6





Grupa: Zarejestrowani
Postów: 102
Pomógł: 12
Dołączył: 27.01.2007
Skąd: north              Poziom: 158                     Tytuł: Miszcz

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


Ja w swoim FW, front controllera użyłem do załadowania i odpalenia całego systemu (i on tam rozdzielał zadania do reszty modułów frameworka). Kontroler jest czynnikiem logicznym aplikacji i nie powinieneś tam umieszczać takich rzeczy jak kontakt ze źródłem danych i wyświetlanie (ani drobne echo, żadnego formowania tekstu). Co tam powinno być? Obliczenia na danych, sortowanie, przygotowanie do wyświetlenia (udostepnienie modułowi View). Najważniejsze jest odpowiednie rozdzielenie operacji pomiędzy 3 warstwy: M V C.
Wyświetlaniem zajmuje się warstwa View. Na początek może to być klasa includująca pliki szablonów (w miare rozwoju fw, będziesz mógł bez konsekwencji zmienić metodę wyświetlania). Taka porada: w klasie View dobrze jest przeciążyć magiczne metody _set() i __get(). ;]


--------------------
Blog | plugin system by carbolymer
Residence: #php.pl @ IRCNet
"Pralki powstały po to, aby kobiety też mogły programować"
Go to the top of the page
+Quote Post
Beynar
post
Post #7





Grupa: Zarejestrowani
Postów: 60
Pomógł: 1
Dołączył: 6.12.2007

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


Napisalem cos takiego, ale wiem, ze to jest zle:

index.php:
  1. <?php
  2. // read current path
  3. $thisPath=$_SERVER[&#092;"SCRIPT_FILENAME\"];
  4. $end=strlen($thisPath)-9;
  5. $main=substr($thisPath, 0, $end);
  6.  
  7. // set pathes
  8. // all pathes contain \"/\" on the end
  9. $GLOBALS[&#092;"_PATHS\"][\"main\"]=$main;
  10. $GLOBALS[&#092;"_PATHS\"][\"config\"]=$main.\"config/\";
  11. $GLOBALS[&#092;"_PATHS\"][\"controllers\"]=$main.\"controllers/\";
  12. $GLOBALS[&#092;"_PATHS\"][\"classes\"]=$main.\"classes/\";
  13. $GLOBALS[&#092;"_PATHS\"][\"images\"]=$main.\"images/\";
  14. $GLOBALS[&#092;"_PATHS\"][\"models\"]=$main.\"models/\";
  15. $GLOBALS[&#092;"_PATHS\"][\"libs\"]=$main.\"libs/\";
  16. $GLOBALS[&#092;"_PATHS\"][\"photos\"]=$main.\"photos/\";
  17. $GLOBALS[&#092;"_PATHS\"][\"styles\"]=$main.\"styles/\";
  18. $GLOBALS[&#092;"_PATHS\"][\"templates\"]=$main.\"templates/\";
  19. $GLOBALS[&#092;"_PATHS\"][\"views\"]=$main.\"views/\";
  20.  
  21. // load config
  22. $conf=parse_ini_file($_PATHS['config'].&#092;"config.ini\", true);
  23. $GLOBALS[&#092;"_CONFIG\"]=$conf;
  24.  
  25.  
  26. // include libaries
  27. require($_PATHS['libs'].&#092;"db_mysql_dev.php\");
  28. require($_PATHS['libs'].&#092;"mapper.php\");
  29.  
  30. // start
  31. require($_PATHS['controllers'].&#092;"front.php\");
  32. ?>

ustalam sciezki
czytam konfiguracje
includuje biblioteki i na koncu przekazuje kontrole do wlasciwego kontrolera
A wlasciwy kontroler wyglada tak:
front.php
  1. <?php
  2. // module
  3. $module=null;
  4. if(isset($_GET[&#092;"module\"]))
  5. $module=$_GET[&#092;"module\"];
  6. if(isset($_POST[&#092;"module\"]))
  7. $module=$_POST[&#092;"module\"];
  8.  
  9. // select module
  10. switch ($module){
  11. case &#092;"konkurs\":
  12. require($_PATHS['controllers'].&#092;"competition.php\"); 
  13. break;
  14.  
  15. case &#092;"regulamin\":
  16. require($_PATHS['controllers'].&#092;"rules.php\");
  17. break;
  18.  
  19. case &#092;"dodaj\":
  20. require($_PATHS['controllers'].&#092;"add.php\");
  21. break;
  22.  
  23. case &#092;"porady\":
  24. require($_PATHS['controllers'].&#092;"advices.php\");
  25. break;
  26.  
  27. case &#092;"galeria\":
  28. require($_PATHS['controllers'].&#092;"gallery.php\");
  29. break;
  30.  
  31. case &#092;"nagrody\":
  32. require($_PATHS['controllers'].&#092;"awards.php\");
  33. break;
  34.  
  35. case &#092;"organizatorzy\":
  36. require($_PATHS['controllers'].&#092;"organisers.php\");
  37. break;
  38.  
  39. default:
  40. require($_PATHS['controllers'].&#092;"competition.php\");
  41. break;
  42. }
  43. ?>

dodam ze powyzszy kontroler jest zrzutowany na odpowiedni dzialy. Tzn. powyzszych requierow jest tyle ile mam glownych dzialow - przyciskow w glownym menu.

Zatem glowny kontroler przekazuje kontrole dalej do kolejnych 'Page controllerow'? tak sie to nazywa w terminologi kontrolerow. Zatem powyzsza czesc to moj front controller, tylko ze wszedzie jest pisany obiektowo a ja mam strukturlanie i nie wydaje mi sie on byc poprawny... nie lezy mi on.

Ten post edytował Beynar 13.01.2008, 21:44:24
Go to the top of the page
+Quote Post
carbolymer
post
Post #8





Grupa: Zarejestrowani
Postów: 102
Pomógł: 12
Dołączył: 27.01.2007
Skąd: north              Poziom: 158                     Tytuł: Miszcz

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


oj oj, ten switch gryzie w oczy. wiem ze to jest zabezpieczenie anty h4x, ale można swobodniej nieco postąpić. po przesianiu wartości $_GET['module'] można spokojnie dać require($_PATHS['controllers'].$_GET['module']);. Da ci to aplikacji większą elastyczność.
Co do ładowania systemu i FC, troche za mało OOP, właściwie jego tam wcale nie ma. Powinno być coś z rodzaju $oRouter->init(); i kilka innych linijek które mówią dokładnie co jest kiedy ładowane ;]


--------------------
Blog | plugin system by carbolymer
Residence: #php.pl @ IRCNet
"Pralki powstały po to, aby kobiety też mogły programować"
Go to the top of the page
+Quote Post
Beynar
post
Post #9





Grupa: Zarejestrowani
Postów: 60
Pomógł: 1
Dołączył: 6.12.2007

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


A co sadzicie o pomysle, zeby w osobnym pliku konfiguracjynm ini opisac np. czego wymaga dana akcja tzn. okreslac tam jakich wymaga bibliotek, jaki uruchamia moduł, jaki parametrów są niezbędne i czy wymagana jest jakas dodatkowa autentykacja.
Kontroler na podstawie takiej konfiguracji moglby wszystko ładować smile.gif
Jak wy to rozwiazujecie?
Na sztywno w kodzie wywolujecie dla danej akcji odpowiednie includy i powolujecie odpowiednie metody? a sprawdzanie czy są wymagane argumenty itd? Mozna by to skupic w jednym pliku konfiguracyjnym kontrolera.
Go to the top of the page
+Quote Post
Moli
post
Post #10





Grupa: Zarejestrowani
Postów: 662
Pomógł: 45
Dołączył: 26.03.2007
Skąd: Warszawa

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


Cytat
Jak wy to rozwiazujecie?

Ja mam tak że router zwraca mi tablice do kontrollera w takiej formie (przyklad)
Kod
Array (
'Controller' => 'NameController' ,
'Method' => 'NameMethod',
'Var' => Array (
... zmienne ...
)
)

Przekazuje to do controllera, ktory w tym wypadku wczytuje klase NameControllr z metoda NameMethod i przekazuje jej podane zmienne. Oczywiście mozesz zrobic zamiast przekazyania do metody w klasie do czystego pliku, to juz rozwiazesz jak bedziesz chcial winksmiley.jpg
Go to the top of the page
+Quote Post
Beynar
post
Post #11





Grupa: Zarejestrowani
Postów: 60
Pomógł: 1
Dołączył: 6.12.2007

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


1. Pojawiły sie jeszcze dwa pojęcia ktorych do konca nie rozumiem: dispatcher i router

router ma odpowiadac za przekierwoanie akcji? redirect i forwardowanie

2. Jakkolwiek do kazdej strony musze pisac obsluge danej juz akcji. Strukturalnie? Jak wy piszecie wykonanie akcji na samym koncu - przed przekazaniem danych wynikowych do widoku

Prosze o wyrozumialosc
jestem poczatkujacym smile.gif

pozdrawiam

Ten post edytował Beynar 14.01.2008, 12:05:36
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #12





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Tak się niczego nie nauczysz - będziesz miał tylko mętlik w głowie. Biorąc po uwagę przedstawiony przez Ciebie kod uważam, że za wcześnie bierzesz się za wspomniane wzorce i tak, jak powiedział ~mike - poznaj teorię - najlepiej z jakiejś książki.

Mówisz, że ZF i inne FW mają rozbudowane kontrolery - nie zgodzę się - uważam, że w każdy z nich jest wręcz ubogi. Skoro jednak uważasz, że są to za ciężkie rozwiązania dla Ciebie, to tym bardziej nie powinieneś implementować kontrolera fasady, routera itp.
Ogranicz się do prostych kontrolerów strony (Page Controller)

Umieszczane informacji o akcjach w zewnętrznych plikach ma sens jedynie wtedy, gdy dysponujesz odpowiednio rozbudowanymi kontrolerami - inteligentnymi kontrolerami. Wspomaga to wówczas programowanie wg. wzorca Command, którego implementacje (akcje) nie muszą się martwić o poboczne zadania (np. ustalenie widoku, który zostanie wywołany).

Pozdrawiam.


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
mike
post
Post #13





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Cytat(Beynar @ 14.01.2008, 12:03:16 ) *
Strukturalnie?
Jeśli mówimy o wzorcach projektowych to mówimy tylko i wyłącznie w kontekście programowania obiektowego.

I na prawdę polecam najpierw teorię. Kontrolery w Zendzie są jednymi z prostszych, więc może się okazać, że powywasz się na coś czego nie rozumiesz.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 19.08.2025 - 17:06