Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Router - teoria
Forum PHP.pl > Forum > PHP > Object-oriented programming
ulow
Wg mnie, klasa routera powinna parsować url'e jak i je tworzyć, ogólnie wszystko co z nimi związane. U siebie, chcę zrobić to tak, że będę miał adresy postaci:

domena.pl/modul/akcja/parametr1/parametr2/parametrN

Z wydobyciem modulu i akcji i wywołania tego, nie będę miał problemu, ale rozchodzi się tutaj o parametry, które będą przekazywane do akcji. W jaki sposób je rozróżniać? Skąd router ma wiedzieć który parametr jest do czego? Nie wchodzi w grę tutaj ustawianie wszystkiego w htaccess, bo nie do każdej akcji będą przekazywane parametry w ten sam sposób. No i nie chcę mieć adresów: domena.pl/?modul=foo&akcja=bar&param1=... itd, chociaż wtedy nie byłoby problemu. Myślałem nad czymś takim jak jest w Symfony, a mianowicie pliczek routing.yml itd, ale nie mam pojęcia jak to zaimplementować smile.gif

Ktoś podsunie jakieś sensowne rozwiązania? Albo wskaże mi moje błędy
pablo89pl
Zobaczj ka to wyglada we frameworkach...

wzsystko zazwyczaj dziala tak: index.php?q=TUTEN ADRES
przykład
example.pl/index.php?q=modul/akcja/parametr1/parametr2/parametrN

Roouter odczytuje parametr $_GET['q'] i go odpowiednio parsuje(miliony sposobów)
pierwsze dwa bierzesz na modul i akcje, reszte pod parametry, wrzucając do soobnej tablicy i dostęp po indeksie
smile.gif
Crozin
Routing w Symfony2 jest napisany (chyba) do tego stopnia "niezależnie", że powinieneś być w stanie zrobić Copy&Paste, lekko dostosować i będzie działać: http://github.com/symfony/symfony/tree/mas...onents/Routing/

Co do sposobu działania routingu w symfony 1.4. Każda reguła ma zdefiniowany parametr url, który jest zwykłym wyrażeniem regularnym:
Kod
hello:
  url: /hello/:name/blah/:abc
  requirements: name: [a-z]+, abc: \d+

->

#^/hello/(?<name>[a-z]+)/blah/(?<abc>\d+)$#
Przy wchodzeniu na stronę /hello/crozin/blah/12345 po kolei sprawdzasz czy któraś z zdefiniowanych reguł pasuje do URLa (preg_match).
Natomiast generowanie URLi to proces odwrotny do powyższego. Podajesz nazwę reguły oraz parametry (jeżeli są potrzebne). Sprawdzasz czy każdy z parametrów spełnia wymagania (ponownie preg_match) i sklejasz ostateczny URL.
zegarek84
Cytat(ulow @ 29.06.2010, 14:52:37 ) *
Wg mnie, klasa routera powinna parsować url'e jak i je tworzyć, ogólnie wszystko co z nimi związane. U siebie, chcę zrobić to tak, że będę miał adresy postaci:

domena.pl/modul/akcja/parametr1/parametr2/parametrN

Z wydobyciem modulu i akcji i wywołania tego, nie będę miał problemu, ale rozchodzi się tutaj o parametry, które będą przekazywane do akcji. W jaki sposób je rozróżniać? Skąd router ma wiedzieć który parametr jest do czego? Nie wchodzi w grę tutaj ustawianie wszystkiego w htaccess...
W ZF robi się baaardzo króciutką regułkę w .htaccess i całą resztę opisuje na klasach... do przykładu co podałeś musisz określić ruting tak właśnie, by klasa wiedziała co który parametr znaczy... da się zrobić też dla pozostałych nie opisanych parametrów zczytać domyślnie jeśli dasz na końcu regułki '*' i wtedy z reszty parametrów na końcu adresu było by /nazwa1/wartosc1/nazwa2/wartosc2... ale ogólnie to dłuższy temat... routing na klasach opisuje się mniejwięcej w możliwej kolejności wystąpienia i prubuje się dopasować do pierwszego lepszego... jeśli jakiegoś parametru nie ma a miał być można określić domyślną wartość czy to akcji, zmiennej, kontrolera czy modułu... ogólnie jeśli byś chcaił się zainteresować ZF to poczytaj tutaj:
http://manual.zfdes.com/pl/zend.controller.router.html - można routing oprzeć także na wyrażeniach regularnych... - masz tam przykłady i dobrze opisane co i jak - ale po angielsku...
Cytat(ulow @ 29.06.2010, 14:52:37 ) *
Ktoś podsunie jakieś sensowne rozwiązania? Albo wskaże mi moje błędy
Jakiś framwork najlepiej - chyba, że chcesz coś sensownego od podstaw pisać ^^ - ale to i tak pasowało by luknąć na jakieś gotowe rozwiązania... - to, że podałem linka do manuala ZF nie znaczy, że akurat jego musisz wybierać...
Zyx
Router to w zasadzie dopasowywanie do wzorca. Musisz sobie określić, jakie rodzaje ograniczeń Twój router będzie obsługiwać, następnie dodać metodę, która pozwoliłaby wprowadzić pojedynczą regułę ograniczeń, która przy okazji będzie z parametrów budować wyrażenie regularne. Sprawdzanie jest proste - jedziesz po kolejnych regułach i pierwsza, która zaakceptuje wyrażenie regularne, jest sprawdzana pod kątem tego, czy wszystkie obowiązkowe parametry są ustawione. Jak wszystko jest OK, budujesz tablicę parametrów i zwracasz ją.
crusher
Ja korzystam z takiego rozwiązania:
.htaccess
RewriteEngine On

RewriteRule ^([_a-zA-Z0-9]+)?/?([_A-Za-z0-9]+)?/?([_A-Za-z0-9]+)?/?([_A-Za-z0-9]+)?/?([_A-Za-z0-9]+)?/?([_A-Za-z0-9]+)?/?([_A-Za-z0-9]+)?$ /index.php/$0/$1/$2/$3/$4/$5/$6

i dalej

  1. $arrParams = array();
  2. $strDefaultPath = $cfg['sa']."index.php/";
  3. $_SERVER['PATH_INFO'] = isset( $_SERVER['PATH_INFO'] ) ? $_SERVER['PATH_INFO'] : $strDefaultPath;
  4. $a = explode( '/', substr( $_SERVER['PATH_INFO'], 1) );
  5. $a = preg_replace("[A-Za-z0-9_]", '', $a);


dalej korzystasz z tego jak z tablicy smile.gif $a[0] ..... a adres wygląda tak http://www.jakisadres/zimenna1/zmienna2/zmienna3

Nie wiem czy o takie rozwiązanie ci chodziło.
_olo_1984
Podepnę się z moim problemem, mam prosty router, który przekształca mi adres:
http://domain.com/index.php/module/action/param1/param2/ na tabilcę, a dalej dane już co moduł co akcja idą w aplikację.
Generalnie jest w porządku, nie potrzebuję do tego htaccess.

Jednak chciałbym zrobic coś takiego, kiedy w aplikacji mam kilka modułów, powiedzmy cms, article, news i dla modułu article chciałby tworzyć adresy typu:
http://domain.com/index.php/article/Krzysi...zis_98_lat_hej/
obecnie to zrobiłem tak, że dla modułu "article" jest ustawiona akcja domyślna "show" - na sztywno, ale odpada, kiedy dopiszemy inne akcje, typu comment. I pytanie jest takie, czy ktoś może podpowiedzieć, jak odbierać adresy, kiedy nie wiemy czy iidentyfikator action będzie podany, czyli adres
http://domain.com/index.php/article/Krzysi...zis_98_lat_hej/ ma tak samo działać jak
http://domain.com/index.php/article/show/K...zis_98_lat_hej/ czy
http://domain.com/index.php/article/Krzysi..._lat_hej/page/1 z paginatorem

widzę tutaj propozycję wyrażeń regularnych, jednak na mój niedoświadczony rozumek, to chyba nie sprawdzi się, skoro tytuł jak i nazwa akcji będą pasować do jednego wzorca np. przykład
http://domain.com/index.php/article/show/wielkanoc/
http://domain.com/index.php/article/wielkanoc/

a po ilości parametrów też raczej odpada, bo nie wiadomo, czy nie będzie drugiego parametru. Kurcze, mam nadzieję, że nie namieszałem za bardzo,
analizuję jak to jest właśnie w symfony i kohanie, ale jakoś nie mogę znaleść rozwiązania problemu. Prosiłbym o jakąś wskazówkę. Pozdrawiam
crusher
Cytat(_olo_1984 @ 5.07.2010, 08:21:34 ) *
Jednak chciałbym zrobic coś takiego, kiedy w aplikacji mam kilka modułów, powiedzmy cms, article, news i dla modułu article chciałby tworzyć adresy typu:
http://domain.com/index.php/article/Krzysi...zis_98_lat_hej/
obecnie to zrobiłem tak, że dla modułu "article" jest ustawiona akcja domyślna "show" - na sztywno, ale odpada, kiedy dopiszemy inne akcje, typu comment. I pytanie jest takie, czy ktoś może podpowiedzieć, jak odbierać adresy, kiedy nie wiemy czy iidentyfikator action będzie podany, czyli adres
http://domain.com/index.php/article/Krzysi...zis_98_lat_hej/ ma tak samo działać jak
http://domain.com/index.php/article/show/K...zis_98_lat_hej/ czy
http://domain.com/index.php/article/Krzysi..._lat_hej/page/1 z paginatorem

htacces likwiduje z adresu index.php a co za tym idzie ładniej to wyglada, co do odbierania adresu kiedy nie masz podanej akcji to swich / if .. else

Cytat(_olo_1984 @ 5.07.2010, 08:21:34 ) *
widzę tutaj propozycję wyrażeń regularnych, jednak na mój niedoświadczony rozumek, to chyba nie sprawdzi się, skoro tytuł jak i nazwa akcji będą pasować do jednego wzorca np. przykład
http://domain.com/index.php/article/show/wielkanoc/
http://domain.com/index.php/article/wielkanoc/

a po ilości parametrów też raczej odpada, bo nie wiadomo, czy nie będzie drugiego parametru. Kurcze, mam nadzieję, że nie namieszałem za bardzo,
analizuję jak to jest właśnie w symfony i kohanie, ale jakoś nie mogę znaleść rozwiązania problemu. Prosiłbym o jakąś wskazówkę. Pozdrawiam

Powinienes mieć usystematyzowane tworzenie linków tzn.
http://domain.com/index.php/article/wielkanoc
http://domain.com/index.php/article/wielkanoc/edit
http://domain.com/index.php/article/wielkanoc/comment
Bynajmniej u mnie się to świtnie sprawdza, zawsze wiem czego mam się na której pozycji spodziewać
wyr. reg. sprawdza się doskonale bo tylko to co spełnia Ci warunek będzie przepuszczone (bezpieczeństwo), kwestia dopracowanie sobie wzorca i przemyslenia jak chcesz aby aplikacjia działała.
posiadacz
A ja widzę to tak:

1. Router uniwersalny parsujący link:
explodujesz po slashach i bierzesz: 1- kontroller, 2-akcja, i w pętli{ 3-parName, 4-parValue}
2. Dopisujesz wyjątki od reguły, np w kontrolerze article (któremu możesz również dodać alias - artykuł i wersje językowe: news) przepisujesz brak akcji na akcję show:
np przez tablicę:
  1. array('rule' => 'artykul,%1-%2', 'controller' => 'article', 'action' => 'show', 'params' => array(1 => 'idArticle', 2 => 'articleName')
  2. );


Najpierw sprawdzasz dopasowanie do wyjątkó, i tylko jeżeli tam nie znajdziesz dopasowania to przepuszczasz do routera standardowego.
gothye
ja poszłem w podobnym kierunku ,wykorzytsałem preg_match parsując link , dzięki temu dowolnie można go budować
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-2024 Invision Power Services, Inc.