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
bim2
post
Post #2





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

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


Mhh, dobra to może teraz cos takieog pokaże. Fajnie działa:
index.php
  1. <?
  2. define('PATH_ACTION', 'actions/');
  3. define('PATH_MODEL', 'models/');
  4. define('PATH_VIEW', 'views/');
  5. define('PATH_CLASS', 'class/');
  6. define('PATH_LIB', 'libs/');
  7. $conn = mysql_connect('localhost', 'root', '');
  8. mysql_select_db('nfs_new', $conn);
  9. class Controler {
  10. public $objAction; //objekt akcji
  11. public $action; //akcja
  12. private $defaultAction = 'index'; //domyślna akcja
  13. public $objMod;
  14. public $model;
  15. public $objViewC;
  16. public $objView;
  17.  
  18. public $router;
  19. public $oldAction;
  20. public $getView;
  21. public $view;
  22.  
  23. function __construct($router)
  24. {
  25. $this->router = $router;
  26. $this->action = $router->getString('action');
  27. $this->view = $this->router->getString('view');
  28. }
  29. function & getInstance()
  30. {
  31. return $this;
  32. }
  33. function getAction()
  34. {
  35. return $this->action = ($this->action) ? $this->action : $this->defaultAction;
  36. }
  37. function setAction($action='')
  38. {
  39. $this->action = $action;
  40. $this->perfom(true);
  41. }
  42. function setView($view='')
  43. {
  44. $this->view = ($view) ? $view : 'defaults';
  45. $this->perfom();
  46. }
  47. function getView()
  48. {
  49. return ($this->view) ? $this->view : 'defaults';
  50. }
  51. function perfom($doesntAction=false)
  52. {
  53. $action_path = PATH_ACTION.$this->getAction().'.action.php';
  54.  
  55. if(!file_exists($action_path))
  56. {
  57. if(!$doesntAction)
  58. {
  59. $this->oldAction = $this->getAction();
  60. $this->setAction('ActionDoesntExists');
  61. return;
  62. }
  63. else
  64. {
  65. echo 'Nie można znaleĽć '.$this->action;
  66. return;
  67. }
  68. }
  69. else
  70. {
  71. if(!is_object($this->objAction))
  72. {
  73. require_once $action_path;
  74. $act = $this->getAction();
  75. $this->objAction = New $act($this);
  76. }
  77. $gview = $this->getView();
  78. $this->objAction->$gview($this);
  79.  
  80. }
  81. }
  82. function display()
  83. {
  84. if(!is_object($this->objViewC))
  85. {
  86. require_once PATH_LIB.'view.lib.php';
  87. $this->objViewC = new View();
  88. }
  89. return $this->objViewC;
  90. }
  91.  
  92. function model()
  93. {
  94. $this->model = $this->getAction().'Mod';
  95. $path = PATH_MODEL.$this->getAction().'.model.php';
  96. if(!is_object($this->objMod))
  97. {
  98. if(!file_exists($path))
  99. {
  100. $this->setAction('ModelDoesntExists');
  101. return;
  102. }
  103. else
  104. {
  105. require_once $path;
  106. }
  107.  
  108. $this->objMod = new $this->model($this);
  109. }
  110.  
  111. return $this->objMod;
  112.  
  113. }
  114.  
  115. function view()
  116. {
  117. $this->view = $this->getAction().'View';
  118. $path = PATH_VIEW.$this->getAction().'.view.php';
  119. if(!is_object($this->objView))
  120. {
  121. if(!file_exists($path))
  122. {
  123. $this->setAction('ViewDoesntExists');
  124. }
  125. else
  126. {
  127. require_once $path;
  128. }
  129.  
  130. $this->objView = new $this->view($this);
  131. }
  132.  
  133. return $this->objView;
  134.  
  135. }
  136.  
  137. }
  138. class Router
  139. {
  140. function getString($name_param, $typ='get')
  141. {
  142. return (string) $_GET[$name_param];
  143. }
  144. }
  145. $router = new Router;
  146.  
  147. $ctrl = new Controler($router);
  148. $ctrl->perfom();
  149. ?>


libs/view.lib.php
  1. <?
  2. class View {
  3. private $Assign;
  4. function assign($assign)
  5. {
  6. foreach ($assign as $key => $value) 
  7. {
  8. echo $key.'= '.$value.'<hr>';
  9.  
  10. } 
  11. }
  12. function fetch($plik)
  13. {
  14. return $this->Assign;
  15. }
  16. }
  17. ?>

models/index.model.php
  1. <?
  2. class IndexMod {
  3. public $query;
  4. public $ctrl;
  5. function __construct($ctrl)
  6. {
  7. $this->ctrl = $ctrl;
  8. }
  9. function defaults()
  10. {
  11. $q=mysql_query("SELECT * FROM new_news");
  12. while($r=mysql_fetch_assoc($q))
  13. {
  14. $news[$r['news_id']]['tytul']=$r['news_tytul'];
  15. $news[$r['news_id']]['text']=$r['news_tekst'];
  16.  
  17. }
  18. $this->query = $news;
  19. /*$view = $cont->display();
  20. $view->assign(array('lol' => 'lolek'));
  21. echo $view->fetch('jakis_plik');*/
  22. }
  23. function news()
  24. {
  25. if($this->ctrl->router->getString('id'))
  26. {
  27. $q=mysql_query("SELECT * FROM new_news WHERE news_id='".$this->ctrl->router->getString('id')."'");
  28. $news['tytul']=$r['news_tytul'];
  29. $news['text']=$r['news_tekst'];
  30. $this->query = $news;
  31. }
  32. else
  33. {
  34. $this->ctrl->setView();
  35. }
  36. /*$view = $cont->display();
  37. $view->assign(array('lol' => 'lolek'));
  38. echo $view->fetch('jakis_plik');*/
  39. }
  40. }
  41. ?>

views/index.view.php
  1. <?
  2. class IndexView {
  3. public $query;
  4. function __construct($ctrl)
  5. {
  6.  
  7. }
  8. function defaults($mod)
  9. {
  10. $views = $mod->ctrl->display();
  11. foreach($mod->query AS $val)
  12. {
  13. $views->assign($val);
  14. }
  15.  
  16. echo $views->fetch('rrf');
  17. /*$view = $cont->display();
  18. $view->assign(array('lol' => 'lolek'));
  19. echo $view->fetch('jakis_plik');*/
  20. }
  21. function news_one($mod)
  22. {
  23. $views = $mod->ctrl->display();
  24. $views->assign($mod->query);
  25.  
  26. echo $views->fetch('rrf');
  27. }
  28. }
  29. ?>

no i ostanie
actions/index.action.php
  1. <?
  2. class Index {
  3. function __construct($ctrl)
  4. {
  5.  
  6. }
  7. function defaults($ctrl)
  8. {
  9. $mod = $ctrl->model($ctrl);
  10. $mod->defaults();
  11. $widok = $ctrl->view();
  12. $widok->defaults($mod);
  13.  
  14. }
  15. function news($ctrl)
  16. {
  17. $mod = $ctrl->model($ctrl);
  18. $mod->news();
  19. $widok = $ctrl->view();
  20. $widok->news_one($mod);
  21.  
  22. }
  23. }
  24. ?>


Czy jest juz na lepszej drodze? Powiem tlyo że to działa ?view=news&id=1 lub jak podasz tylko view=news to przejdzie do defaults() (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Jestem na dobrej drodze? Prosze powiedzieć prosto z mostu. "TAK" lub "NIE" (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)
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 - 02:14