Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klasa Router - pomoc w zrozumienia założenia i wykonaniu
Forum PHP.pl > Forum > PHP > Object-oriented programming
Joachim Peters
Witam,

Próbuje napisać klasę Router do swojego systemu, jednak chyba coś mi nie wychodzi. Proszę spojrzeć.
  1. <?php
  2.  
  3. class Router {
  4.  private $url;
  5. private $params = array();
  6.  
  7. public function __construct() {
  8. $this->url = $_SERVER['PATH_INFO'];
  9.  
  10. $this->getParams();
  11. }
  12.  
  13. // pobiera nazwę serwera
  14. public function getServerName() {
  15. return $_SERVER['HTTP_HOST'];
  16. }
  17.  
  18. public function getParams() {
  19. $this->params = explode('/', $this->url);
  20. }
  21.  
  22. // pobiera parametr o wyznaczonym id
  23. public function getParam($id) {
  24. return (isset($this->params[$id])) ? $this->params[$id] : false;
  25. }
  26.  
  27. // pobiera nazwę modułu np. news, page, download
  28. public function getModule() {
  29. return $this->getParam(0);
  30. }
  31.  
  32. // pobiera nazwę akcji np. edit, add lub delete
  33. public function getAction() {
  34. return $this->getParam(1);
  35. }
  36.  
  37. // tworzy adres URL np. wpisując createUrl('news/edit/2'); otrzymamy domena.com/index.php/news/edit/2
  38. public function createUrl($params) {
  39. return $this->getServerName().'/index.php/'.$params;
  40. }
  41. }
  42.  
  43. ?>


Czy dobrze zrozumiałem założenie tej klasy?
jastu
Czy ten kod nie działa...? Jeśli działa to w czym problem, jeśli masz wątpliwości to możesz je mieć tylko do funkcjonalności tej klasy. Poszukaj we frameworkach klasy która zajmuje się obrabianiem URL'i i na nich się wzoruj.Pozdrawiam
Joachim Peters
Może, lepiej spytam tak, jakie zadania powinna mieć klasa Router? Tylko odczytywanie parametrów z adresu czy także tworzenie URL-i na potrzeby skryptu (przekierowania, formularze itd.)? Co w tej klasie powinno się znaleźć? Proszę bardziej o teorię niż kod.
menic
No ja u siebie tez mam router. I wykonuje on wszystkie czynnosci translujace url w kazda strone. Dekoduje adres do tablicy i z tablicy tworzy adres smile.gif
SHiP
Ja u siebie napisałem rozpoznawanie zmiennych po ich typach (http://srodek.fc.pl/blog/19/Przyjazne-adresy---tworzymy-router). Obsługa roznych domen/subdomen to tez dobry pomysl...
bim2
Przerobiłbym nieco metode generującą url'ka. Chodzi o uniwersalność. Dajmy na to, że masz domyślnie adresy zwykłe:
?action=Index&model=news&id=2
a chcesz mieć np.
Index/id.2/News.html

Ja rozwiązałem to tak, że podaje do funcji 3 argumenty, z czego ostatni moze byc pusty.
function generateUrl($sAction, $sModel = 'Index', $aParametrs = array())
{
[tu generowanie]
}

Z resztą chyba sobie poradzisz winksmiley.jpg
menic
IMO o wiele wygodniejszy jest sposób bla( 'akcja/model?id=2&dupa=super' )
Konwencja zapożyczona troche z sf smile.gif
bim2
Menic, nono chyba coś zmienie w mojej klasie router party.gif

W ogóle od poniedziałku zabieram się za symfony... obczaje co i jak i może będę korzystał biggrin.gif
Strzałek
Cytat
Próbuje napisać klasę Router do swojego systemu, jednak chyba coś mi nie wychodzi. Proszę spojrzeć.


Dlaczego Ci nie wychodzi winksmiley.jpg ? Wywala Fatal Error ? Chyba nie, a jeżeli nie tzn. że wychodzi. To co napisałeś działa i to się liczy. Jeżeli potrzebujesz żeby działało to jak działa to nie zmieniaj. Tak Ci wygodnie to tak rób. Nie rób niczego na siłę. Taka mała uwaga.

Co powinien robić router? Powinien wyciągnąć z url'a informacje potrzebne kontrolerowi do działania, oraz powinien umieć później generować url'e. Tyle. Obszerniej na ten temat pisałem na moim blogu. Link w podpisie.

Cytat
Przerobiłbym nieco metode generującą url'ka. Chodzi o uniwersalność. Dajmy na to, że masz domyślnie adresy zwykłe:
?action=Index&model=news&id=2
a chcesz mieć np.
Index/id.2/News.html

Ja rozwiązałem to tak, że podaje do funcji 3 argumenty, z czego ostatni moze byc pusty.
function generateUrl($sAction, $sModel = 'Index', $aParametrs = array())
{
[tu generowanie]
}

Z resztą chyba sobie poradzisz winksmiley.jpg


Mało uniwersalna to uniwersalność u Ciebie winksmiley.jpg Ja u siebie taką rzecz rozwiązałem bardzo prosto i uniwersalnie:

index.php?module=News&action=ShowOne&id=312 --> dane wyciągamy z $_GET
index.php/news/showOne/312 --> router rozbijający /news/showAll
index.php/news/id.312 --> RewriteRouter dziedziczący po normalnym routerze, z zadeklarowanymi ścieżkami. Przykład takiego routera u mnie na blogu w komentarzach notki o Routerze.

Pozdrawiam Rkingsmiley.png
Luken
To może ja się pochwalę. Ostatnio również pisałem klasę Routera. I teraz mój router sprowadza się wyłącznie do konfiguracji takiej:

[nazwaŚcieżki]
pattern = "(lang:string)/index/(id:integer)/"
controller = "page"
action = "view"
hidden_params = ""

A więc nazwa wiadomo co oznacza. Pattern to szablon, posiada specjalne zmienne z możliwością ustalenia typu (string,integer,any). Kontroler wiadomo, akcja tak samo. Teraz ciekawa zmienna hidden_params, jej zastosowanie omówię w następnym przykładzie.

[nazwaŚcieżki]
pattern = "catalog/product/superprodukt.html"
controller = "page"
action = "view"
hidden_params = "(id:22),(lang:pl)"

W ten sposób odciążyłem htaccess. smile.gif Zmienne z hidden_params przetwarzam do klasy input.

Do generowania urli wykorzystuję nazwę ścieżki. Podaję nazwę i url z parametrami. smile.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.