Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: REQUEST_URI i modrewrite, httpRequest
Forum PHP.pl > Forum > PHP > Object-oriented programming
Apo
Witam
Ostatnio zaczełem proby nad napisaniem własnego frameworka i natrafilem na problem. Przykładowy adres wygląda tak:
http://strona.pl/news/show/id/5

Pierwsze 2 parametry to nazwa kontrolera, 2 to nazwa akcji a id jest parametrem o wartosci 5. (czyli tak jek jest w ZendFramework. No i teraz do odczytania tej sciezki z REQUEST_URI potrzebuje modrewrite z przekierowaniem na index.php. Nastepnie router odczytuje wszystkie te dane i przekazuje je dalej aby wywołać odpowiedni kontroler. Wszystko byłoby ładnie tylko HttpRequest ma pustą tablice $_GET i niewiem czy dobrym rozwiązaniem jest zrobienie w routerze takiego czegoś:

  1. <?php
  2. // class router
  3. // odczytanie poszczególnych parametrów ($parameters = array('id' => 5);)
  4. $HttpRequest->setGet($parameters);
  5. ?>


No i jeszcze pytanie czy dobrym rozwiazaniem jest uzywanie modrewrite do odczytania sciezki, czy lepiej zrobić adres typu:
http://strona.pl/index.php?news/show/id/5 :?:

Pozdrawiam Apo
bigZbig
Dodaj w Routerze (ZF) te linijke.

  1. <?php
  2. $_GET += array('controller' => $controller, 'action' => $action) + $params;
  3.  ?>


Ten zapis spowoduje odzwierciedlenie w tablicy predefiniowanej GET parametrow przekazanych w adresie.
dtb
Cytat
No i jeszcze pytanie czy dobrym rozwiazaniem jest uzywanie modrewrite do odczytania sciezki, czy lepiej zrobić adres typu:
http://strona.pl/index.php?news/show/id/5


zamiast http://strona.pl/index.php?news/show/id/5 lepiej uzyc http://strona.pl/index.php/news/show/id/5 i zmiennej $_SERVER['PATH_INFO'];
envp
Rozwiazanie napisane przeze mnie i wzorowane na ZF:

  1. <?php
  2. class Router Implements IRouter
  3. {
  4.  
  5. private $_sURI = null;
  6. private $_aParams = null;
  7. private $_sCtrlName = null;
  8. private $_sActName = null;
  9. private $_oDispatcher = null;
  10. private $_oActionCollectioner = null;
  11.  
  12. public function __construct()
  13. {
  14. $this->_sURI = $this->_formatQuery();
  15. }
  16. // formatQuery - zwraca nam potrzebne parametry wycinajaz z PATH_INFO niepotrzebne rzeczy typu i
    ndex.php
  17. private function _formatQuery(){
  18. return substr($_SERVER['REQUEST_URI'],strlen($_SERVER['SCRIPT_NAME'])-9,strlen($_SERVER['REQUEST_URI']));
  19. }
  20.  
  21. public function route()
  22. {
  23.  
  24. if (strstr($this->_sURI, '?')) {
  25. $this->_sURI = substr($this->_sURI, 0, strpos($this->_sURI, '?'));
  26. }
  27. $this->_aParams = explode('/', trim($this->_sURI, '/'));
  28. $this->_sCtrlName = $this->_aParams[0];
  29. $this->_sActName = isset($this->_aParams[1]) ? $this->_aParams[1] : null;
  30.  
  31.  //jesli nie ma kontrollera i akcji - podaj domyslne
  32.  
  33. if (!strlen($this->_sCtrlName))
  34. {
  35. $this->_sCtrlName = _DEFAULT_CTRL_NAME;
  36. $this->_sActName = _DEFAULT_ACT_NAME;
  37. }
  38.  
  39.  $aActParams = array();
  40.  for ($i=2; $i<sizeof($this->_aParams); $i=$i+2) {
  41.  $aActParams[$this->_aParams[$i]] = isset($this->_aParams[$i+1]) ? $this->_aParams[$i+1] : null;
  42.  }
  43.  //- tworzy DispatcheTokena - Kontener który zawiera informacja o akcji :
  44.  
  45.  $oCurrentAction = new DispatcherToken($this->_sCtrlName, $this->_sActName, $aActParams);
  46.  
  47.  return $oCurrentAction;
  48.  // zwracany do Front Kontrollera, który kładzie go do KonteneraAkcji, który znowu 
    przetwarzany jest w petli i wykonywany aż do opróżnienia...
  49.  }
  50.  
  51.  
  52. }
  53. ?>
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.