Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Pierwsze kroki z MVC
Vielta
post
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
(IMG:style_emoticons/default/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
 
Start new topic
Odpowiedzi
Vielta
post
Post #2





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

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


Nie wiem jak ty ale ja pani domu nie czytam ;P (wolę sekrety serca!)

O Phpdoc z reguły pamiętam, teraz nie używałem bo pisałem to tylko i wyłącznie w celach edukacyjnych. W sumie fakt, powinienem dodać jak wrzucałem na forum, mea culpa.

Cytat
Co mi da wprowadzenie obiektu? Czy łatwo mogę rozszerzyć możliwości klasy? Jakie ograniczenia sobie stwarzam?
Odpowiedziałem sobie na te pytania, co mi to daje? Brak konieczności powtarzania niektórych bloków kodu, oddzielone od siebie wszystko co związane z bazą/widok/logika. W sumie mogę łatwo rozszerzyć ale nie jestem pewien do jednego, [u]nie przemawia do mnie motyw tego, że żeby odwołać się do Template muszę to robić przez Controller.

Średnio widzę miejsce gdzie Type Hinting mógł bym użyć

Ten post edytował Vielta 8.09.2010, 14:38:06
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
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 8.10.2025 - 02:49