Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MVC] Moj poczatek / implementacja
Helios
post
Post #1





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 8.07.2006

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


Witam
Od niedawna zaczalem interesowac sie MVC. Ale w dalszym ciagu nie wiem czy dobrze rozumuje istote MVC. Dlatego postanowilem napisac prosty (powtarzam, prosty, system) zeby sprawdzic czy ide w dobrym kierunku. Prosze o komentarze, jesli chodzi o sam schemat i istote wzorca MVC.

Na poczatek przedstawie strukture katalogow:

./ - katalog glowny
actions/ - katalog przechowujacy pliki .ini do wybranej akcji mozemy podac co ma zostac wykonane nastepnie
configs/ - katalog z plikami konfiguracyjnymi - narazie nie uzyty
controllers/ - katalog z kontrolerami - narazie tylko kontroler glowny
models/ - katalog z plikami modeli
views/ - katalog z plikami widokow
index.php - plik glowny ktory uruchamia kontroler

Zaczynamy od poczatku - kod kontrolera:
  1. <?php
  2.  
  3. class Ctrl{
  4.  
  5. private $Request=false; // obiekt
  6. private $action; // nazwa akcji - nieobowiazkowa
  7. private $view; // nazwa widoku
  8. protected $model; // nazwa modelu - nieobowiazkowa
  9.  
  10. protected $objView; // obiekt widoku
  11. protected $objModel; // obiekt modelu
  12.  
  13. // konstruktor
  14. public function __construct($request){ 
  15.  
  16. // ustawianie pol klasy
  17. $this->view=$request->getParam('view');
  18. $this->view=($this->view) ? $this->view : 'main'; // ustawianie standardowego widoku
  19. // jesli zostal podany model ustawia jesli nie jest taki sam jak nazwa widoku
  20. $this->model=($request->getParam('model')) ? $request->getParam('model') : $this->view;
  21. // model z sufixem Mod
  22. $this->model.='Mod';
  23. // pobiera parametr akcji o ile zostal podany
  24. $this->action=$request->getParam('action');
  25.  
  26. // jesli zostala podana akcja laduje model i wykonuje odpowiednia czynnosc
  27. if($this->action){
  28. require_once('./models/'.$this->model.'.model.php');
  29. $this->objModel=new $this->model($request);
  30. $action=$this->action;
  31. $this->objModel->$action();
  32. do{
  33. // sprawdza czy plik konfiguracyjny akcji uwzglednia wykonanie kolejnej akcji
  34. $tmpCfg=parse_ini_file('./actions/'.$this->action.'.ini');
  35. $action=$tmpCfg['next'];
  36. // jesli tak to ja wykonuje itd.
  37. $this->objModel->$action();
  38. }while(!$tmpCfg['next']);
  39. }
  40. // laduje obiekt widoku
  41. $this->execute();
  42. }
  43.  
  44. public function execute($view=false){
  45. // sprawdza czy obiekt modelu juz istnieje czyli czy podana byla akcja
  46. if(!is_object($this->objModel)){
  47. require_once('./models/'.$this->model.'.model.php');
  48. $this->objModel=new $this->model($request);
  49. }
  50. // laduje obiekt widoku
  51. require_once('./views/'.$this->view.'.view.php');
  52. $this->objView=new $this->view($this->objModel);
  53. }
  54.  
  55. }
  56.  
  57. ?>

Zakladamy, ze uzytkownik wpisal: index.php?view=Users&action=addUser&userName=root
kontroler laduje wiec model UsersMod:
  1. <?php
  2.  
  3. class UsersMod {
  4.  
  5. public $addedUser;
  6. public $request;
  7. public $count;
  8.  
  9. function __construct($request){
  10. $this->request=$request;
  11. }
  12.  
  13. function addUser(){
  14. $this->addedUser=$this->request->getParam('userName');
  15. return true;
  16. }
  17.  
  18. function countUsers(){
  19. return $this->count++;
  20. }
  21.  
  22. function getAddedUser(){
  23. return $this->addedUser;
  24. }
  25.  
  26. function getUsersNum(){
  27. return $this->count;
  28. }
  29.  
  30. }
  31.  
  32. ?>

i wykonuje w nim akcje zmianu danych, a poniewaz akcja addUser() posiada plik konfiguracjny z wywolaniem jako kolejnej akcji countUsers wywoluje kolejna akcje. No i pozostaje wyswietlenie widoku Users:
  1. <?php
  2.  
  3. class Users {
  4.  
  5. function __construct($objModel){
  6. print 'Dodalem uzytkownika: '.$objModel->getAddedUser().' i teraz mam zarejestrowanych uzytkownikow: '.$objModel->getUsersNum();
  7. }
  8.  
  9. }
  10.  
  11. ?>


Co sadzicie o tym? Czy dobrze rozumuje istote MVC? Zapraszam do dyskusji...
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Prph
post
Post #2





Grupa: Zarejestrowani
Postów: 338
Pomógł: 2
Dołączył: 4.03.2006
Skąd: Łódź

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


Witam,

Ostatnio napisalem (mam nadzieje) framework i z przyjemnoscia podziele sie moimi uwagami.

1. NAJWAZNIEJSZA ZASADA
Jezeli piszesz framework dla siebie - pisz go tak, aby byl wygodny dla Ciebie.

2. MVC
MVC mowi, ze masz miec model, widok i kontroler. Model nie wyswietla daych, widok nie grzebie w bazie. Kontroler umozliwia im jakas tam wspolprace.


Nie podoba mi sie struktura katalogow. Tzn ja zmianilbym ja na nastepujaca:

actions/ - kontrolery akcji
models/ - modele
views/ - widoki
configurations/ - konfiguracje wszystkiego co zbudujesz na owym frameworku (np. akcji lub bibliotek, ktore bys mogl pozniej dodac.)

konfiguracje mozesz zapisywac w plikach o przykladowych nazwach: DodajUzytkownikaAction.ini, UsunNewsaAction.ini, MojaBibliotekaJPEGLibrary.ini.

Teraz nieco do kontrolera. Ktos powiedzial, ze jest malo elastyny. No w sumie trudno go zrobic innego, jak kolega dopiero zaczyna.
Ja przyczepie sie do fragmentu nastepujacego:

  1. <?php
  2. if($this->action){
  3. require_once('./models/'.$this->model.'.model.php');
  4. $this->objModel=new $this->model($request);
  5. $action=$this->action;
  6. $this->objModel->$action();
  7. do{
  8. // sprawdza czy plik konfiguracyjny akcji uwzglednia wykonanie kolejnej akcji
  9. $tmpCfg=parse_ini_file('./actions/'.$this->action.'.ini');
  10. $action=$tmpCfg['next'];
  11. // jesli tak to ja wykonuje itd.
  12. $this->objModel->$action();
  13. }while(!$tmpCfg['next']);
  14. }
  15. // laduje obiekt widoku
  16. $this->execute();
  17. ?>


Dlaczego ladujesz model? To nie nalezy do kontrolera. Ja wiem, ze moze byc tak wygodnie. Ale sa akcje w ktorych z niego nie skorzystasz. Przyklad?

Akcja ktora wyswietla kominikat, jezeli nie znaleziono strony. Np masz akcje PokazZdjecia. Ktos wpisze adres:
jakasStrona.pl/akcja=PokazFotografie.

Jezeli kontroler nie znajdzie PokazFotografie to milo jest, jak odpalisz akcje np. NieZnaleziono. Ona wyswietli jedynie komunikat, zwroci Error 404 lub cos innego. Model nie jest tu najczesciej potrzebny.

Zrob tak:

1. Sprawdz o jaka akcje uzytkownik prosi. np: strona.pl/akcja=PokazZdjecie.
2. Jezeli jest pusta (np. podano strona.pl/), to ustaw domyslna (np. StronaGlowna).
3. Jezeli nie jest pusta, pobiez ja i sprawdz czy istnieje.
4. Jezeli nie, przypisz akcji akcje NieZnaleziono. Sprawdz czy istnieje (tak dla spokoju) i jak nie ma akcji (usunales ja, albu dysk padl (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) ), to zglos jakis blad.

5. Jezeli akcja istanieje - uruchom ja.

Teraz akcja jezeli chce, prosi po model, ustawia sobie widok. Pobiera dane z modelu, przekazuje je widokowi. Widok moze wyswietlic, albo zwrocic kontrolerowi (w kontrolerze piszesz $oWidok = $oAkcja->uruchom()(IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) . Wtedy kontroler ja wyswietla albo robi co mu sie podoba (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Zeby nie bylo malo, zalaczam fragmenty mojego kodu:
  1. <?php
  2. class Error403Action extends Action
  3. {
  4.  
  5. public function execute()
  6. {
  7. return Controller::getInstance()->getView('Error403'); // kontroleg glowny tworzy mi obiekt widoku o tej nazwie.
  8. }
  9. }
  10. ?>


  1. <?php
  2.  
  3. class Error403View extends ExtendedHtmlView
  4. {
  5. public function __construct()
  6. {
  7. parent::__construct(); // wywoluje konstruktor klasy bazowej. Raczej jest mi to potrzebne.
  8.  
  9. $this->setTemplate('Error403'); // ustawiam sobie szablon. Uzywam zwyklych szablonow php.
  10. }
  11. }
  12.  
  13. ?>


Dam jeszcze przyklad jak to jest z modelem:

  1. <?php
  2. class ShowPageAction extends Action
  3. {
  4. public function execute()
  5. {
  6. $oController = Controller::getInstance();
  7.  
  8. $sPageName = $oController->getContext()->getRequest()->getParameter('page', HttpRequest::GET);
  9.  
  10. if(is_null($sPageName))
  11. $sPageName = 'Index';
  12.  
  13. $oPageModel = $oController->getModel('Page');
  14.  
  15. if(!($aPage = $oPageModel->getPageByName($sPageName)))
  16. {
  17. $oController->forward(_ACTION_ERROR_404);
  18. return null;
  19. }
  20.  
  21. $oView = $oController->getView('ShowPage');
  22.  
  23. if(!empty($aPage['title']))
  24. $oView->setAttribute('pageTitle', $aPage['title']);
  25.  
  26. $oView->setAttribute('pageContent', $aPage['content']);
  27.  
  28. return $oView;
  29. }
  30.  
  31. public function isSecure()
  32. {
  33. return false;
  34. }
  35. }
  36. ?>


  1. <?php
  2. class PageModel
  3. {
  4. public function getPageByName($sPageName)
  5. {
  6. $sPageName = basename($sPageName);
  7.  
  8. $sPageFileName = _DIR_APPLICATION . 'pages/' . $sPageName . '.html';
  9.  
  10. if(is_readable($sPageFileName))
  11. {
  12. $aPage['title'] = null;
  13. $aPage['content'] = file_get_contents($sPageFileName);
  14.  
  15. return $aPage;
  16. }
  17. else
  18. return false;
  19. }
  20. }
  21. ?>


Mama nadzieje, ze troche pomoglem.

Adrian.
Go to the top of the page
+Quote Post

Posty w temacie
- Helios   [MVC] Moj poczatek / implementacja   8.07.2006, 14:42:03
- - hwao   Jeżeli to działą, to jest dobre... Nie ma "sz...   8.07.2006, 20:31:55
- - Cysiaczek   Cóż. To zależy, czy widok ma wyciągac dane, czy ap...   8.07.2006, 21:58:18
- - ActivePlayer   @hwao co widok robi u CIebie ?   8.07.2006, 22:34:54
- - hwao   Cytat(Cysiaczek @ 8.07.2006, 22:58 ) Có...   8.07.2006, 22:49:49
- - ActivePlayer   u mnie element widok to 'class view extends sm...   8.07.2006, 22:58:19
- - Cysiaczek   Cytat(hwao @ 8.07.2006, 21:49 ) Umnie g...   8.07.2006, 23:03:10
- - Ociu   Jak na pierwsze starcie nie jest najgorzej. Jak pi...   9.07.2006, 08:19:52
- - Prph   Witam, Ostatnio napisalem (mam nadzieje) framewor...   9.07.2006, 09:54:01
- - .rh-   Witam Odgrzebuje temat, podpisuje się pod nim. Ró...   28.07.2006, 19:39:26
- - Ociu   W mvc chodzi o to, aby moduły/akcje były podzielon...   29.07.2006, 08:36:37
- - Prph   Ociu dobrze mowi Pamietaj, ze MVC to nie framewo...   29.07.2006, 10:02:16
- - .rh-   Zgadza sie, pytam, gdyz czytajac wiele artykulow ...   30.07.2006, 00:09:38
- - thornag   Cytat(Helios @ 8.07.2006, 14:42 ) i wykon...   22.08.2006, 18:53:50
- - Prph   Witam, Akcja: dobrze rozumiesz czym jest. Akcja t...   23.08.2006, 15:08:22
- - thornag   Tak to wszystko miele i mam jeszcze kilka kolejnyc...   23.08.2006, 20:57:30
- - Prph   Witam, Nie podoba mi sie u Ciebie organizacja MVC...   23.08.2006, 22:17:50
- - thornag   Hmm, duzo dalo mi to do myslania, tymbardziej ze p...   23.08.2006, 22:39:14
- - Ociu   Każdy sposób jest dobry, jeśli Ty uwa...   24.08.2006, 07:51:55
- - thornag   @Ociu No tak. Ale inni programisci mogliby stwierd...   24.08.2006, 09:35:02
- - Prph   Jak interpretowac termin kontroler, to zalezy jak ...   24.08.2006, 21:37:40
- - bim2   Przeczytałem temat i teraz ja zadam pare pytań . T...   25.08.2006, 09:07:34
- - thornag   @prph korzystajac z Twojej zyczliwosci a przedewsz...   25.08.2006, 09:26:01
- - bim2   Thormag, powiem ci że nakierowałes mnie Kod mi si...   25.08.2006, 10:02:18
- - thornag   Z tego co zrozumialem model nie ustawia widoku. Mo...   25.08.2006, 11:13:33
- - Ludvik   Trochę zbyt sztywno trzymacie się powiązania model...   25.08.2006, 11:41:22
- - bim2   Mhh, dobra to może teraz cos takieog pokaże. Fajni...   25.08.2006, 12:44:23
- - thornag   @Ludvik Czyli reasumujac i po ludzku mozna by powi...   25.08.2006, 12:44:41
- - Ludvik   Żeby rozwiać wątpliwości - blueprints mvc. Sam w d...   25.08.2006, 13:08:17
- - bim2   @thornag: Masz racje. Każdy robi MVC tak jak chce ...   25.08.2006, 13:25:39


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: 10.10.2025 - 18:55