Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Ocena klasy router
Forum PHP.pl > Forum > PHP > Object-oriented programming
Wazniak96
Witam,

od pewnego czasu kojarzę, że tak powiem OOP(znam mniej więcej zasady). Ostatnio postanowiłem napisać coś od podstaw, wybór padł na prostego frameworka.
I tutaj pojawia się ten problem, że tworzę go raczej w formie edukacyjnych i potrzebuję opinii kogoś znającego się na rzeczy, czy idę w dobrą stronę smile.gif

Poniżej podaję kod klasy router, mającej zająć się otworzeniem odpowiedniej klasy oraz wywołania podanej metody.

  1. <?php
  2.  
  3. class Router{
  4.  
  5. private $cotroller;
  6. private $method = 'index';
  7. private $directory;
  8.  
  9. public function __construct()
  10. {
  11. $this->directory = APPPATH . '/controllers/';
  12. require(APPPATH.'/config/config.php');
  13. $this->setController($config['base_controller']);
  14. $this->readData();
  15. $this->run();
  16. }
  17.  
  18. public function setController($controller)
  19. {
  20. $this->controller = ucfirst(str_replace(array('/', '.'), '', $controller));
  21. }
  22.  
  23. public function setMethod($method)
  24. {
  25. $this->method = str_replace(array('/', '.'), '', $method);
  26. }
  27.  
  28. public function readData()
  29. {
  30. $uri = explode('/', $_GET['uri']);
  31. if(isset($uri[0]) && !empty($uri[0]))
  32. $this->setController($uri[0]);
  33.  
  34. if(isset($uri[1]) && !empty($uri[1]))
  35. $this->setMethod($uri[1]);
  36.  
  37. for($i=2; $i<12; $i++)
  38. {
  39. if(isset($uri[$i]) && !empty($uri[$i]))
  40. $data[] = $uri[$i];
  41. }
  42.  
  43. return $data;
  44. }
  45.  
  46. private function run()
  47. {
  48. if(!file_exists($this->directory . strtolower($this->controller) . '.php'))
  49. exit('Środowisko aplikacji nie zostało zainstalowane poprawnie.');
  50. else
  51. {
  52. require($this->directory . strtolower($this->controller) . '.php');
  53.  
  54. $method = $this->method;
  55. $class = new $this->controller;
  56. $class->$method();
  57. }
  58. }
  59. }


Wszelka krytyka mile widziana snitch.gif

PS: Brakuje jeszcze sprawdzenia czy podana metoda istniej, a w innym wypadku przekierowanie, ale postanowiłem zrobić to trochę później, kiedy ogólnie zajmę się błędami.
Crozin
1. Zadanie routera to zamiana ciągu wejściowego (najczęściej adresu URL) na parametry potrzebne do wywołania odpowiedniej akcji w aplikacji. Samo wywołanie akcji nie należy już do jego zadań. Dodatkowo router może robić jeszcze odwrotną operację, tj. na podstawie parametrów akcji generować URL.
2. Twój kod łamie podstawowe zasady OOP (patrz: trzy pierwsze punkty), zasadę pojedynczej odpowiedzialności, IoC czy ukierunkowania na interfejsy. Nieprzestrzeganie tych standardów właściwie niweluje cały pożytek z obiektówki.
3. Do obsługi błędów służą wyjątki, a od ładowania klas są autoloadery.
Wazniak96
Sorki, że tak trochę nie drążyłem tematu ale byłem trochę zalatany, że tak powiem, mniejsza o to.

1. Da się zrobić.
2. Okej, przeczytałem na ten temat i wiem na czym polegają moje błędy, ale teraz jak przenieść to na tą klasę? Jak abstrakcję, polimorfizm oraz dziedziczenie wykorzystać? Z tego punktu wygląda na to, że lepiej byłoby zamienić ją na zbiór funkcji..
3. Poczytam-zrobię. Tak jak pisałem, tworzę tego frameworka dla celów edukacyjnych, ale nie wszystko na raz. smile.gif
Crozin
Pisanie w celach edukacyjnych jest jak najbardziej OK, ale trzeba mieć na start jakieś obeznanie w temacie. Wygląda na to, że go nie posiadasz dlatego powinieneś raczej skupić się na wykorzystaniu i zrozumieniu działania istniejących rozwiązań - dużo szybciej i solidniej nauczysz się masy rzeczy na tym etapie. W dodatku w nieporównywalnie krótszym czasie. Tutaj zasugerowałbym wykorzystanie Symfony, bo jako jeden z niewielu PHP-owych "fullstack webframeworków" solidnie realizuje drugi punkt z mojej listy.
Wazniak96
Szczerze mówiąc bawiłem się już trochę w CodeIgniter i całkiem dobrze się pracowało. Za Symfony wolałbym się na razie nie zabierać bo obawiam się, że go nie ogarnę.

W każdym razie dzięki za pomoc i mądrą radę smile.gif
Crozin
CI to wyjątkowo słaby FW jeżeli chodzi o OOP. SF czy inny "rozbudowany" FW na pewno może sprawić na początku nieco problemów, ale żadne z nich nie są nie do przejścia.
Wazniak96
Hmm... Dobrze wiedzieć. Pisząc powyższą klasę wzorowałem się na CI, ale jak widać nie wszylo za dobrze.

Jeszcze takie jedno pytanko. Co byłoby najlepiej spróbować na początek napisać w Symfony? smile.gif
Crozin
Cytat
Co byłoby najlepiej spróbować na początek napisać w Symfony?
Obojętnie co. Może to być standardowy blog czy inna strona-wizytówka. Chociaż wg mnie najlepiej zrobić sobie klona jakiejś istniejącej "nieszablonowej" strony.
Wazniak96
Okej, jeszcze raz wielkie dzięki za pomoc wink.gif
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.