Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Kontroler od podstaw
Forum PHP.pl > Forum > PHP
Beynar
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
nrm
dużo się nauczysz przeglądając klasy i opis do nich z Zend pseudo Frameworka.
Cysiaczek
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.
Beynar
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... :/
mike
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.
carbolymer
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(). ;]
Beynar
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.
carbolymer
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 ;]
Beynar
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.
Moli
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
Beynar
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
Cysiaczek
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.
mike
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.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.