Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [Klasa] Router, Moje pierwsze praktyczne kroki w OOP i prośba o ocenę :)
mathev19
post
Post #1





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 22.11.2009
Skąd: Gdańsk

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


Na wstępie chciałem się ze wszystkimi przywitać, ponieważ jest to mój pierwszy post.
Dobrze przejdźmy więc do rzeczy napisałem sobie klasę Routera, której kod możecie zobaczyć poniżej. Przede wszystkim proszę o obiektywną krytykę bo jest to moja pierwsza klasa. (IMG:style_emoticons/default/snitch.gif)
  1. <?php
  2.  
  3. class Router {
  4. private $sPath = null;
  5. private $sController = null;
  6. private $sAction = null;
  7. private $aUrlSegments = array();
  8. private $aParams = array();
  9.  
  10. public function __construct() {
  11. $this->sPath = $_SERVER['PATH_INFO'];
  12. $this->setUrlSegments();
  13. $this->setController();
  14. $this->setAction();
  15. $this->setParams();
  16. }
  17.  
  18. /**
  19. * pobiera nazwę serwera
  20. * @return string
  21. */
  22. public function getServerName() {
  23. return $_SERVER['HTTP_HOST'];
  24. }
  25.  
  26. /**
  27. * pobiera ścieżkę i dzieli ją na segmenty
  28. * następnie umieszcza wszystko w tablicy aUrlSegments
  29. */
  30. private function setUrlSegments() {
  31. $this->aUrlSegments = explode('/', $this->sPath);
  32. }
  33.  
  34. /**
  35. * ustawia nazwę controllera
  36. */
  37. private function setController() {
  38. $this->sController = $this->getUrlSegment(1);
  39. }
  40.  
  41. /**
  42. * pobiera nazwę controllera
  43. */
  44. public function getController() {
  45. return $this->sController;
  46. }
  47.  
  48. /**
  49. * ustawia nazwę akcji
  50. */
  51. private function setAction() {
  52. $this->sAction = $this->getUrlSegment(2);
  53. }
  54.  
  55. /**
  56. * pobiera nazwę akcji
  57. */
  58. public function getAction() {
  59. return $this->sAction;
  60. }
  61.  
  62. /**
  63. * pobiera segment URL'a o wyznaczonym id
  64. * @param int $id
  65. * @return string
  66. */
  67. public function getUrlSegment($id) {
  68. return (isset($this->aUrlSegments[$id])) ? $this->aUrlSegments[$id] : false;
  69. }
  70.  
  71. /**
  72. * ustawia parametry z URL'a
  73. */
  74. private function setParams(){
  75. $this->aParams = array_slice($this->aUrlSegments,3);
  76. }
  77.  
  78. /**
  79. * pobiera parametry z URL'a
  80. */
  81. public function getParams(){
  82. return $this->aParams;
  83. }
  84.  
  85. /**
  86. * tworzy adres URL
  87. * @param string $sController
  88. * @param string $sAction
  89. * @param array $aParams
  90. * @return string
  91. */
  92. public function createUrl($sController,$sAction,$aParams) {
  93. return $this->getServerName().'/index.php/'.$sController.'/'.$sAction.'/'.$aParams[0].'/'.$aParams[1].'/'.$aParams[2];
  94. }
  95. }
  96.  
  97. ?>

Teraz moje pytania dotyczące ów klasy:
1. Czy ogólny sposób napisania Routera jest zgodny z filozofią OOP?
2. Co mogę napisać inaczej (czyt. lepiej)?
3. W jaki sposób prawidłowo tworzyć URL'e (metoda createUrl, na którą jak widać w kodzie nie mam zupełnie pomysłu) (IMG:style_emoticons/default/sadsmiley02.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Cytat
singleton nie,rejestr nie, jak to rozwiążesz? wszystko przez parametr ciągle?
Przekazywanie jako argument jest bardzo dobrym sposobem. Jednak z czasem może nie wystarczyć - wtedy warto skorzystać np. z Dependency Injection czy Service Locator.
Cytat
Jest to tzw. notacja węgierska
Ahhh... dzięki za przypomnienie. (IMG:style_emoticons/default/winksmiley.jpg)
Cytat
Mógłbyś rozwinąć twoją myśl? Bo nie za bardzo "łapię".
W skrócie: jeżeli dana metoda ma być niedostępna z zewnątrz i nie masz jakiegoś konkretnego powodu by blokować jej widoczność w klasach potomnych - powinna być prywatna. Co do tego, że te metody set*() wepchałeś na siłę:
  1. public function __construct() {
  2. $this->aUrlSegments = explode('/', $this->sPath);
  3. $this->sController =$this->aUrlSegments[1];
  4. $this->sAction = $this->aUrlSegments[2];
  5. }
  6.  
  7. // tutaj same gettery
Nie wykonujesz tam żadnych skomplikowanych operacji - dlatego możesz bez problemu wrzucić całość do kontrolera.
Cytat
Jeżeli chodzi o Kontroler to powiedz mi jakiego typu informację może on wysyłać do Modelu?
Może przekazać mu takie dane do jakich widok nie ma dostępu lub nie leżą one do zakresu działania logiki widoku.
Cytat
Kontroler ma być pośrednikiem informacji pomiędzy Modelem a Widokiem?
W sieci znajdziesz w zdecydowanej większości przypadków (dla PHP) kontrolera działającego właśnie jako pośrednik (kontroler pobiera dane z modelu i przekazuje je do widoku). Natomiast poprawną implementacją MVC jest zrobienie z kontrolera takiej "swatki". Określa on, żę ten a ten widok ma użyć tego, a tego modelu.
Go to the top of the page
+Quote Post

Posty w temacie


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: 10.06.2026 - 12:33