Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Klasa Router - pomoc w zrozumienia założenia i wykonaniu
Joachim Peters
post
Post #1





Grupa: Zarejestrowani
Postów: 196
Pomógł: 2
Dołączył: 1.03.2006

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


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?
Go to the top of the page
+Quote Post
jastu
post
Post #2





Grupa: Zarejestrowani
Postów: 382
Pomógł: 0
Dołączył: 29.11.2005
Skąd: :jestem();

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


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

Ten post edytował jastu 24.08.2007, 10:56:36
Go to the top of the page
+Quote Post
Joachim Peters
post
Post #3





Grupa: Zarejestrowani
Postów: 196
Pomógł: 2
Dołączył: 1.03.2006

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


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.
Go to the top of the page
+Quote Post
menic
post
Post #4





Grupa: Zarejestrowani
Postów: 493
Pomógł: 0
Dołączył: 14.06.2003
Skąd: Tomaszów Lubelski/Rzeszów

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


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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
SHiP
post
Post #5





Grupa: Zarejestrowani
Postów: 697
Pomógł: 47
Dołączył: 19.12.2003
Skąd: Lublin

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


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...
Go to the top of the page
+Quote Post
bim2
post
Post #6





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

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


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 (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
menic
post
Post #7





Grupa: Zarejestrowani
Postów: 493
Pomógł: 0
Dołączył: 14.06.2003
Skąd: Tomaszów Lubelski/Rzeszów

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


IMO o wiele wygodniejszy jest sposób bla( 'akcja/model?id=2&dupa=super' )
Konwencja zapożyczona troche z sf (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
bim2
post
Post #8





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

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


Menic, nono chyba coś zmienie w mojej klasie router (IMG:http://forum.php.pl/style_emoticons/default/party.gif)

W ogóle od poniedziałku zabieram się za symfony... obczaje co i jak i może będę korzystał (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
Strzałek
post
Post #9





Grupa: Przyjaciele php.pl
Postów: 384
Pomógł: 6
Dołączył: 11.09.2004
Skąd: Grodzisk Mazowiecki

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


Cytat
Próbuje napisać klasę Router do swojego systemu, jednak chyba coś mi nie wychodzi. Proszę spojrzeć.


Dlaczego Ci nie wychodzi (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/Rkingsmiley.png)
Go to the top of the page
+Quote Post
Luken
post
Post #10





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 10.10.2004
Skąd: Wodzisław Śląski

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


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. (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Zmienne z hidden_params przetwarzam do klasy input.

Do generowania urli wykorzystuję nazwę ścieżki. Podaję nazwę i url z parametrami. (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

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: 28.09.2025 - 21:13