Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: MVC Pomoc przy warstwie widoku
Forum PHP.pl > Forum > PHP
Ultear
Witam,

W celach treningowych projektuje sobię aplikację na MVC, przeczytałem dość dużo artykułów na temat MVC, z których się dowiedziałem, że zarówno Controller i View musi obsługiwać warstwę modelu.

I tu zwracam się do was z prośbą o pomoc w rozwikłaniu tego problemu, bo zastanawiam się jak to zaprojektować, by kontroler i widok używały tej samej instancji modelu, a także mam takie pytanie: Jak widok powinien wyglądać?

A tutaj cały kod, który dotychczas napisałem:

Index.php
  1. <?php
  2.  
  3.  
  4. //Installation path(Do not change this, unless you know what are you doing)
  5. define('BASE_DIR', __DIR__);
  6.  
  7. /*
  8.  *--------------------------------------------------
  9.  *---------------CONFIGURATION SECTION--------------
  10.  *--------------------------------------------------
  11.  */
  12.  
  13. //Home page - Default page
  14. //Must be existing controller
  15.  
  16. define("DEFAULT_CONTROLLER", 'home');
  17.  
  18. /*
  19.  *--------------------------------------------------
  20.  *-----------------------PATHS----------------------
  21.  *--------------------------------------------------
  22.  */
  23.  
  24. $paths['app'] = BASE_DIR.DIRECTORY_SEPARATOR.'application'.DIRECTORY_SEPARATOR;
  25. $paths['controllers'] = $paths['app'].'controllers'.DIRECTORY_SEPARATOR;
  26. $paths['models'] = $paths['app'].'models'.DIRECTORY_SEPARATOR;
  27. $paths['views'] = $paths['app'].'views'.DIRECTORY_SEPARATOR;
  28. $paths['libs'] = $paths['app'].'libraries'.DIRECTORY_SEPARATOR;
  29. $paths['helpers'] = $paths['app'].'helpers'.DIRECTORY_SEPARATOR;
  30. $paths['styles'] = $paths['app'].'styles'.DIRECTORY_SEPARATOR;
  31.  
  32.  
  33. //Ustawienia środowiska
  34.  
  35. /*
  36.  * Środowisko służy do ustawiania trybu wyświetlania błędów
  37.  * Istnieją 3 tryby
  38.  *
  39.  * 0 - Produkcja (Błędy nie są wyświetlane)
  40.  * 1 - Testowanie (Wyświetlane są ostrzeżenia oraz uwagi)
  41.  * 2 - Rozwój (Wszystkie błędy są wyświetlane)
  42.  *
  43.  * Tutaj możesz zmienić ustawienia środowiska:
  44.  */
  45.  
  46. define("SRODOWISKO", 2);
  47.  
  48. /*
  49.  *--------------------------------------------------
  50.  *------------END OF CONFIGURATION SECTION----------
  51.  *--------------------------------------------------
  52.  */
  53.  
  54. if(defined('SRODOWISKO')){
  55. switch(SRODOWISKO){
  56. case 0:
  57. break;
  58. case 1:
  59. error_reporting(E_NOTICE | E_WARNING);
  60. break;
  61. case 2:
  62. break;
  63.  
  64. default:
  65. exit("Środowisko nie jest skonfigurowane poprawnie!");
  66. break;
  67. }
  68. } else{
  69. exit("Środowisko nie jest zdefiniowane!");
  70. }
  71.  
  72. //Check if CMS is installed
  73. if(is_dir(BASE_DIR.'install')){
  74. header(HEADER_LOCATION.'install');
  75. }
  76.  
  77. //Check if paths are valid
  78. if(!is_dir($paths['app'])){
  79. exit('Application folder doesn\'t exist');
  80. } else if(!is_dir($paths['libs'])){
  81. exit('Libraries folder doesn\'t exist');
  82. } else if(!is_dir($paths['controllers'])){
  83. exit('Controllers folder doesn\'t exist');
  84. } else if(!is_dir($paths['models'])){
  85. exit('Models folder doesn\'t exist');
  86. } else if(!is_dir($paths['views'])){
  87. exit('Views folder doesn\'t exist');
  88. } else if(!is_dir($paths['helpers'])){
  89. exit('Helpers folder doesn\'t exist');
  90. } else if(!is_dir($paths['styles'])){
  91. exit('Styles folder doesn\'t exist');
  92. }
  93.  
  94. //Autoload called classes
  95. spl_autoload_register( function ($className) {
  96. global $paths;
  97. $className = ltrim($className, '\\');
  98. $fileName = '';
  99. $namespace = '';
  100. if ($lastNsPos = strrpos($className, '\\')) {
  101. $namespace = substr($className, 0, $lastNsPos);
  102. $className = substr($className, $lastNsPos + 1);
  103. $fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
  104. }
  105. $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
  106.  
  107. require $paths['app'].$fileName;
  108. });
  109.  
  110. //Load error class
  111. $error = new Libraries\Error();
  112.  
  113. if(isset($_GET['url'])){
  114. $url = filter_var($_GET['url'], FILTER_SANITIZE_URL);
  115. $url = rtrim($url, '/');
  116. } else{
  117. $url = DEFAULT_CONTROLLER;
  118. }
  119.  
  120. $url = explode('/', $url);
  121.  
  122. if(file_exists($paths['controllers'].$url[0].'.php')){
  123. $controller = "Controllers\\{$url[0]}";
  124. $controller = new $controller;
  125.  
  126. switch(count($url)){
  127.  
  128. case 1:
  129. if(method_exists($controller, 'main')){
  130. $controller->main();
  131. } else{
  132. $error->display404();
  133. }
  134. break;
  135.  
  136. case 2:
  137. if(method_exists($controller, $url[1])){
  138. $controller->{$url[1]}();
  139. } else{
  140. $error->_404();
  141. }
  142. break;
  143.  
  144. case 3:
  145. if(method_exists($controller, $url[1])){
  146. $controller->{$url[1]}($url[2]);
  147. } else{
  148. $error->display404();
  149. }
  150. break;
  151.  
  152. case 4:
  153. if(method_exists($controller, $url[1])){
  154. $controller->{$url[1]}($url[2], $url[3]);
  155. } else{
  156. $error->display404();
  157. }
  158. break;
  159.  
  160. case 5:
  161. if(method_exists($controller, $url[1])){
  162. $controller->{$url[1]}($url[2], $url[3], $url[4]);
  163. } else{
  164. $error->display404();
  165. }
  166. break;
  167.  
  168. case 6:
  169. if(method_exists($controller, $url[1])){
  170. $controller->{$url[1]}($url[2], $url[3], $url[4], $url[5]);
  171. } else{
  172. $error->_404();
  173. }
  174. break;
  175.  
  176. }
  177.  
  178.  
  179. } else{
  180. $error->_404();
  181. }
  182.  
  183.  
  184.  
  185.  


Controller.php

  1. <?php
  2.  
  3. namespace Libraries;
  4.  
  5. class Controller{
  6.  
  7. private $model;
  8. private $view;
  9.  
  10. public function __construct(){
  11. $this->view = new \Libraries\View();
  12. }
  13.  
  14. public function _loadModel($name){
  15. require_once('{$models}{$name}_model.php');
  16. $model = '$name_model()';
  17. $this->model = new $model;
  18. }
  19.  
  20. }


View.php
  1. <?php
  2.  
  3. class View{
  4.  
  5. private $model;
  6. private $template = array();
  7.  
  8.  
  9. public function __construct(){
  10. //$this->model = new
  11. }
  12.  
  13. public function getTemplate($template){
  14.  
  15. $path = '{BASE_DIR}/cache/templates/{$template}_cache.html';
  16.  
  17. if(time()-filemtime($path) <= 15*60){
  18. $this->template[$template] = file_get_contents($path);
  19. } else{
  20. $template = $this->model->fetchTemplate($template);
  21. $cache = fopen($path, 'w');
  22. fwrite($cache, $template);
  23. fclose($cache);
  24. $this->template[$template] = $template;
  25. }
  26.  
  27. }
  28.  
  29.  
  30.  
  31. }


Przeczytałem również, że widok nie powinien działać jak template engine, więc to do czego dążę już jest pewnie źle, proszę o nakierowanie w dobrą stronę, bo wszędzie gdzie szukam w internecie czy po polsku, czy angielsku, żaden artyku nie omawia wyczerpująco MVC, a większość artykułów wprowadza w błąd. Warstwy modelu nie zacząłem ze względu na to, że przeczytałem, że model to nie klasa, więc siętrochę pogubiłem.


Z góry dziękuje smile.gif
devnul
zacznij od nauki podstaw programowania, zamiast tworzyć własnego frameworka skorzystaj z gotowca, bo takie fragment jak ten:

  1. switch(count($url)){
  2.  
  3. case 1:
  4. if(method_exists($controller, 'main')){
  5. $controller->main();
  6. } else{
  7. $error->display404();
  8. }
  9. break;
  10.  
  11. case 2:
  12. if(method_exists($controller, $url[1])){
  13. $controller->{$url[1]}();
  14. } else{
  15. $error->_404();
  16. }
  17. break;
  18.  
  19. case 3:
  20. if(method_exists($controller, $url[1])){
  21. $controller->{$url[1]}($url[2]);
  22. } else{
  23. $error->display404();
  24. }
  25. break;
  26.  
  27. case 4:
  28. if(method_exists($controller, $url[1])){
  29. $controller->{$url[1]}($url[2], $url[3]);
  30. } else{
  31. $error->display404();
  32. }
  33. break;
  34.  
  35. case 5:
  36. if(method_exists($controller, $url[1])){
  37. $controller->{$url[1]}($url[2], $url[3], $url[4]);
  38. } else{
  39. $error->display404();
  40. }
  41. break;
  42.  
  43. case 6:
  44. if(method_exists($controller, $url[1])){
  45. $controller->{$url[1]}($url[2], $url[3], $url[4], $url[5]);
  46. } else{
  47. $error->_404();
  48. }
  49. break;
  50.  
  51. }
świadczy o braku wiedzy (pomijam że brak konsekwencji w nazewnictwie metod do 404 - masz dwie?), można to zrealizować prosto i przyjemnie w taki sposób


  1. if(count($url)){
  2. $action=array_shift($url);
  3. } else {
  4. $action='main';
  5. }
  6. if(method_exists($controller, $action)){
  7. call_user_func_array(array($controler,$action),$url);
  8. } else{
  9. $error->display404();
  10. }
a jak już koniecznie chcesz coś własnego pisać to polecam najpierw lekturę źródeł istniejących rozwiązań
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.