Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Pierwsze kroki z MVC
Vielta
post 8.09.2010, 13:53:01
Post #1





Grupa: Zarejestrowani
Postów: 59
Pomógł: 6
Dołączył: 9.04.2007
Skąd: Szczecin

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


Hej!
W celu lepszego zrozumienia idei MVC postanowiłem troszkę się pobawić i korzystając z wielu dostępnych mi źródeł napisać coś na wzór pseudo-MVC-frameworka. Mam jednak parę pytań, z czego najważniejsze to czy to się w ogóle trzyma kupy?

Autoloader wygląda następująco:
  1. <?php
  2. function __autoload($className) {
  3. if(file_exists(ROOT.DIRECTORY_SEPARATOR.'library'.DIRECTORY_SEPARATOR.strtolower($className).'.class.php')) {
  4. require_once ROOT.DIRECTORY_SEPARATOR.'library'.DIRECTORY_SEPARATOR.strtolower($className).'.class.php';
  5. } elseif(file_exists(ROOT.DIRECTORY_SEPARATOR.'application'.DIRECTORY_SEPARATOR.'controllers'.DIRECTORY_SEPARATOR.strtolower($className).'.php')) {
  6. require_once ROOT.DIRECTORY_SEPARATOR.'application'.DIRECTORY_SEPARATOR.'controllers'.DIRECTORY_SEPARATOR.strtolower($className).'.php';
  7. } elseif(file_exists(ROOT.DIRECTORY_SEPARATOR.'application'.DIRECTORY_SEPARATOR.'models'.DIRECTORY_SEPARATOR.strtolower($className).'.php')) {
  8. require_once ROOT.DIRECTORY_SEPARATOR.'application'.DIRECTORY_SEPARATOR.'models'.DIRECTORY_SEPARATOR.strtolower($className).'.php';
  9. } elseif(file_exists(ROOT.DIRECTORY_SEPARATOR.'library'.DIRECTORY_SEPARATOR.'helpers'.DIRECTORY_SEPARATOR.strtolower($className).'.class.php')) {
  10. require_once ROOT.DIRECTORY_SEPARATOR.'library'.DIRECTORY_SEPARATOR.'helpers'.DIRECTORY_SEPARATOR.strtolower($className).'.class.php';
  11. } else {
  12. // nie ma takiego pliku, jakis error handler?
  13. }
  14. }
Mam taki pseudo "front Controller", który ma za zadanie odpalenie odpowiedniego kontrolera na podstawie $_SERVER['request'] i wygląda on tak:
  1. <?php
  2. class FrontController {
  3. private $_queryString;
  4. private $_controller;
  5. private $_action;
  6. private $_dispatch;
  7. public function callHook($url) {
  8. $urlArray = explode('/', $url);
  9.  
  10. $controller = $urlArray[0]?$urlArray[0]:'main';
  11. array_shift($urlArray);
  12. $action = $urlArray[0]?$urlArray[0]:'index';
  13. array_shift($urlArray);
  14. $queryString = $urlArray;
  15.  
  16. $controllerName = $controller;
  17. $controller = ucfirst($controller);
  18. $model = $controller;
  19. $controller .= 'Controller';
  20.  
  21. $this->_queryString = $queryString;
  22. $this->_controller = $controller;
  23. $this->_action = $action;
  24. if(class_exists($controller)) {
  25. $this->_dispatch = new $controller($model, $controllerName, $action);
  26. } else {
  27. $this->_action = 'error404';
  28. $this->_controller = 'error';
  29. $this->_queryString = $_SERVER;
  30. $this->_dispatch = new ErrorController('error', 'error', 'error404');
  31. }
  32. }
  33.  
  34. public function addHelper($class) {
  35. if($class instanceof TemplateHelper) {
  36. $this->_dispatch->addTemplateHelper($class);
  37. } else {
  38. $this->_dispatch->addModule($class);
  39. }
  40. }
  41.  
  42. public function run() {
  43. if((int)method_exists($this->_controller, 'init')) {
  44. $this->_dispatch->init();
  45. }
  46. $this->_dispatch->{$this->_action}($this->_queryString);
  47. $this->_dispatch->render();
  48. }
  49. }
Klasa Controller, po której dziedziczy każdy kontroler wygląda natomiast tak
  1. class Controller {
  2. protected $_model;
  3. protected $_controller;
  4. protected $_action;
  5. protected $_template;
  6. protected $_modules;
  7.  
  8. public function __construct($model, $controller, $action) {
  9. $this->_controller = $controller;
  10. $this->_model = $model;
  11. $this->_action = $action;
  12. $this->_template = new Template($this->_controller, $this->_action);
  13. }
  14.  
  15. public function addModule($module) {
  16. $this->_modules[get_class($module)] = $module;
  17. }
  18.  
  19. public function addTemplateHelper($helper) {
  20. $this->_template->addTemplateHelper($helper);
  21. }
  22.  
  23. public function set($name, $value) {
  24. $this->_template->set($name, $value);
  25. }
  26.  
  27. public function render() {
  28. $this->_template->render();
  29. }
  30. }
A klasa Template, która odpowiada za wczytanie i wyrenderowanie odpowiedniej templatki (jest dość primitywna)
  1. <?php
  2. class Template {
  3. protected $_variables = array();
  4. protected $_controller;
  5. protected $_action;
  6. protected $_helpers;
  7.  
  8. public function __construct($controller, $action) {
  9. $this->_controller = $controller;
  10. $this->_action = $action;
  11. }
  12.  
  13. public function __set($name, $value) {
  14. $this->set($name, $value);
  15. }
  16.  
  17. public function set($name, $value) {
  18. $this->_variables[$name] = $value;
  19. }
  20.  
  21. public function addTemplateHelper($helper) {
  22. $this->_helpers[get_class($helper)] = $helper;
  23. }
  24.  
  25. public function getHelper($helper) {
  26. return $this->_helpers[$helper];
  27. }
  28.  
  29. public function load($helper) {
  30. $template = new Template('helpers', $helper);
  31. $template->render();
  32. }
  33.  
  34. public function render($doNotRenderHeader = false) {
  35. extract($this->_variables);
  36.  
  37. if($doNotRenderHeader == false) {
  38. if(file_exists(ROOT.DIRECTORY_SEPARATOR.'application'.DIRECTORY_SEPARATOR.'views'.DIRECTORY_SEPARATOR.$this->_controller.DIRECTORY_SEPARATOR.'header.phtml')) {
  39. require_once ROOT.DIRECTORY_SEPARATOR.'application'.DIRECTORY_SEPARATOR.'views'.DIRECTORY_SEPARATOR.$this->_controller.DIRECTORY_SEPARATOR.'header.phtml';
  40. } elseif(file_exists(ROOT.DIRECTORY_SEPARATOR.'application'.DIRECTORY_SEPARATOR.'views'.DIRECTORY_SEPARATOR.'header.phtml')) {
  41. require_once ROOT.DIRECTORY_SEPARATOR.'application'.DIRECTORY_SEPARATOR.'views'.DIRECTORY_SEPARATOR.'header.phtml';
  42. }
  43. }
  44. require_once ROOT.DIRECTORY_SEPARATOR.'application'.DIRECTORY_SEPARATOR.'views'.DIRECTORY_SEPARATOR.$this->_controller.DIRECTORY_SEPARATOR.$this->_action.'.phtml';
  45.  
  46. if($doNotRenderHeader) {
  47. if(file_exists(ROOT.DIRECTORY_SEPARATOR.'application'.DIRECTORY_SEPARATOR.'views'.DIRECTORY_SEPARATOR.$this->_controller.DIRECTORY_SEPARATOR.'footer.phtml')) {
  48. require_once ROOT.DIRECTORY_SEPARATOR.'application'.DIRECTORY_SEPARATOR.'views'.DIRECTORY_SEPARATOR.$this->_controller.DIRECTORY_SEPARATOR.'footer.phtml';
  49. } elseif(file_exists(ROOT.DIRECTORY_SEPARATOR.'application'.DIRECTORY_SEPARATOR.'views'.DIRECTORY_SEPARATOR.'footer.phtml')) {
  50. require_once ROOT.DIRECTORY_SEPARATOR.'application'.DIRECTORY_SEPARATOR.'views'.DIRECTORY_SEPARATOR.'footer.phtml';
  51. }
  52. }
  53. }
  54. }


Jeśli komukolwiek udało się przebrnąć przez te linijki kodu mam 3 pytania:
a) Czy udało mi się uchwycić ideę OOP
cool.gif Czy udało mi się uchwycić ideę MVC
c) Co mogę poprawić, żeby kod był bardziej OOP/MVC.

Przepraszam za chaotyczność (?) tego postu ale mam grypę i logiczne myślenie jest ciężkawe :<.

Pozdrawiam i z góry dzięki,
Vielta
Go to the top of the page
+Quote Post

Posty w temacie
- Vielta   Pierwsze kroki z MVC   8.09.2010, 13:53:01
- - wookieb   O kur... co to za autoloader. Poczytaj o include_p...   8.09.2010, 13:59:23
- - Vielta   Nie wiem jak ty ale ja pani domu nie czytam ;P (wo...   8.09.2010, 14:30:26
- - Crozin   Piszesz o MVC, a tymczasem w kodzie jest jedynie p...   8.09.2010, 17:07:16
- - Vielta   To z modelem zmieniłem chwilę po wrzuceniu posta n...   8.09.2010, 17:29:49
- - wookieb   Nie wiem po co Ci funkcja add_include_path. Ogólni...   8.09.2010, 17:46:41
- - Vielta   add_include_path to funkcja z tego linku, który po...   8.09.2010, 18:03:54
- - Crozin   CytatA jak wg. Ciebie powinno to wyglądać?Wybacz, ...   8.09.2010, 18:31:21
- - Quantum   Trochę dziwnie na moje oko rozwiązałeś sprawę fron...   8.09.2010, 18:31:42
- - Vielta   @Crozin Nie no spoko, wiem, że ten temat jest poru...   8.09.2010, 22:26:50
- - Crozin   Nie sądzisz, że jeżeli by tak było to by się to na...   8.09.2010, 23:28:34
- - Vielta   Zapewne tak by się nazywało. Odpowiedz mi tylko na...   8.09.2010, 23:42:06
- - Crozin   I jedno i drugie - jednak z dużym naciskiem na to ...   8.09.2010, 23:57:14
- - Vielta   A już miałem nadzieję, że zrozumiałem o co chodzi ...   9.09.2010, 00:07:44
- - Crozin   Nie. http://forum.php.pl/index.php?s=&showt.....   9.09.2010, 06:41:26
- - Quantum   w kontrolerze tworzysz widok i do nich przypisujes...   9.09.2010, 06:44:45
- - Crozin   @Quantum: Mógłbyś pokazać jakąś przykładową implem...   9.09.2010, 13:11:07
- - Quantum   hmm, a mógłbyś sprecyzować ? co mogłoby przeszkodz...   9.09.2010, 15:07:09
- - Vielta   Teraz to mi namieszaliście Wg. Quantum'a do ...   9.09.2010, 15:33:47
- - Crozin   @Vielta: Quantum potraktował wartstwę widoku jako ...   9.09.2010, 22:36:49
- - everth   @Crozin jak to się ma do wytycznych tego postu Cys...   9.09.2010, 22:48:36
- - Crozin   Pewnie tak, że powinno tam być: nie pytaj czy rozu...   9.09.2010, 23:16:22


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 Wersja Lo-Fi Aktualny czas: 14.08.2025 - 01:00