Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Rozne konfiguracje routingu dla kazdego elementu aplikacji
Forum PHP.pl > Inne > Hydepark
marcio
Witam co myslicie o definiowaniu routingu kazdego elementu ktory owy routing moze posiadac jako osobny plik i includowac je do glownego routingu?
https://docs.djangoproject.com/en/1.3/topic...-other-urlconfs

Ja widze w tym 2 pro:
-pozadek w routingu
-wiadomo jaki element edytujemy
-wieksza elastycznosc

Co o tym myslicie?
cojack
http://di-side.com/di-side/services/web-so...ervice-symfony/

mi tam starcza coś takiego
!*!
Cytat(marcio @ 25.04.2012, 22:22:19 ) *
Witam co myslicie o definiowaniu routingu kazdego elementu ktory owy routing moze posiadac jako osobny plik i includowac je do glownego routingu?


Zaimplementowałem u siebie coś podobnego, z tą różnicą że jest to nazwa pliku w kluczu 'include'.
marcio
Cytat(!*! @ 25.04.2012, 22:52:05 ) *
Zaimplementowałem u siebie coś podobnego, z tą różnicą że jest to nazwa pliku w kluczu 'include'.

No to tez o tym mowie ;) jesli cie dobrze zrozumialem

Cytat(!*! @ 25.04.2012, 22:52:05 ) *
Zaimplementowałem u siebie coś podobnego, z tą różnicą że jest to nazwa pliku w kluczu 'include'.

Moglbys rzucic kodem ;p?!?
!*!
Nie bardzo bo jest to część FW. Jednak to nie jest trudne.
Pobierasz tablice z ustalonymi regułami (główną), jeśli obecna reguła zgadza się z uri, a w ich wartościach znajdziesz 'include' wczytujesz ten plik do już istniejącej tablicy i sprawdzasz jeszcze raz (oczywiście pomijając już inlude), coś na wzór rekurencji w wielopoziomowym menu.
marcio
Cytat(!*! @ 30.04.2012, 11:19:34 ) *
Nie bardzo bo jest to część FW. Jednak to nie jest trudne.
Pobierasz tablice z ustalonymi regułami (główną), jeśli obecna reguła zgadza się z uri, a w ich wartościach znajdziesz 'include' wczytujesz ten plik do już istniejącej tablicy i sprawdzasz jeszcze raz (oczywiście pomijając już inlude), coś na wzór rekurencji w wielopoziomowym menu.

Nie ma problemu zeby to zaimplementowac chcialem bardziej zobaczyc jak wyglada twoj router i routing ;)
!*!
Cytat(marcio @ 30.04.2012, 12:43:02 ) *
Nie ma problemu zeby to zaimplementowac chcialem bardziej zobaczyc jak wyglada twoj router i routing wink.gif


U mnie opiera się cały routing o wyrażenia regularne, bo nie pasuje mi metoda domena.com/kontroler/akcja/parametr czy jakieś śmieci przesyłane przez get, dlatego całkowicie się tego pozbyłem.

plik z regułami dla aplikacji:

  1. return array(
  2. 'regex_czy_cokolwiek([a-z])' => array(
  3. 'controller' => 'Start', // kontroler
  4. 'method' => 'index', // metoda kontrolera, jeśli jej brakuje, domyślnie jest to index
  5. 'param' => '$1', // parametry
  6. 'param_type' => array('$1' => ':num'),
  7. 'type' => 'static', // czy odwołać się statycznie
  8. 'include' => 'nazwa_pliku' // nazwa pliku z dodatkowym routingiem
  9. );


Dodatkowo wcześniej ładuje coś na wzór 2 routingu, dla aplikacji, jeśli jest ich więcej niż jedna i jest to plik dla całego FW.

  1. return array(
  2. 'nazwaAplikacji' => array(
  3. 'regex' => 'nazwaaplikacji([a-z0-9])', // sprawdzam czy aktualny uri pasuje jeśli tak to wczytuje tą konkretną aplikacje
  4. 'path' => './katalog', // główny katalog aplikacji
  5. 'http_type' => 'https', // czy zgadza się protokół
  6. );


Jesli żadne reguły nie pasują, ładowana jest aplikacja znajdująca się na pierwszej pozycji. Oczywiście w konfigu aplikacji jest informacja czy na serwerze są przyjazne linki itp. dlatego wcześniej przy parsowaniu uri dodaje możliwość "(index.php)?" lub nie. W przekazywanych parametrach są też różnego rodzaju bindy, :num, :year, :app itd.
Niktoś
Tak się zastanawiam,czy portu nie trzeba zmieniać,podczas przekierowywania z http na https?
HTTP standardowo port 80 lub 8080 ,https to port 443.Trzeba by było w konfiguracji apache utworzyć wiele lokacji i w zależności od portu przekierowywać na odpowiedni URL lub utworzyć jakiś load balancer.
!*!
Cytat(Niktoś @ 1.05.2012, 10:44:11 ) *
Tak się zastanawiam,czy portu nie trzeba zmieniać,podczas przekierowywania z http na https?
HTTP standardowo port 80 lub 8080 ,https to port 443.Trzeba by było w konfiguracji apache utworzyć wiele lokacji i w zależności od portu przekierowywać na odpowiedni URL lub utworzyć jakiś load balancer.


A niby w jakim celu? Tzn. nie rozumiem po co chcesz zmieniać porty jak to działa od ręki.
Niktoś
Można użyć virtual host dla portu 80 i określić stronę/y oraz drugi dla portu 443-beż zbędnego url rewriting.
marcio
No dzieki ci bardzo @!*! mam jedno pytanie, tez mam statyczne i dynamiczne reguly routingu:
  1. $configs['delimiter'] = ',';
  2. $configs['self'] = '/';
  3.  
  4. $configs['static_routes'] = array(
  5. 'Contact' => 'Home,Contact',
  6. 'About' => 'Home,About',
  7. 'rss' => 'Home,Index,rss'
  8. );
  9.  
  10. $configs['dynamic_routes'] = array(
  11. 0 => array(
  12. 'pattern' => '/^page\,[0-9]{1,4}$/D',
  13. 'frontcontroller' => 'Home',
  14. 'frontaction' => 'Index',
  15. 'cmpaction' => 'Index'
  16. ),
  17.  
  18. 1 => array(
  19. 'pattern' => '/^[0-9]{1,4}$/D',
  20. 'frontcontroller' => 'Home',
  21. 'frontaction' => 'Index',
  22. 'cmpaction' => 'readNews'
  23. )
  24. );
  25.  
  26. return $configs;

Jak widac mam 2 reguly dynamiczne naleza one do komponentu news.
Linki tworze za pomoca nr segmentu z url czyli mam metode:
  1. $this -> uri -> getSegment(3); //pobierze 4 segment(news od id 400) dla url index.php/Home,Index,readNews,400

Majac taka regule link do wpisu wyglada index.php/400
Wszystko u mnie dziala, doszedlem jednak do wniosku ze jesli zmienie reguly routingu potrzebna bedzie tez zmiana tworzenia linkow, czyli ktory segment ma pobierac defaultowo jest to segment 4 a po dynamicznym routingu mam segment nr 0.
Za kazdym razem musze ingerowac w kod widoku(tam gdzie tworze odnosniki do wpisu) jak mozna takie cos osiagnac autmatycznie?
!*!
Cytat(marcio @ 1.05.2012, 15:50:53 ) *
  1. $this -> uri -> getSegment(3); //pobierze 4 segment(news od id 400) dla url index.php/Home,Index,readNews,400

Majac taka regule link do wpisu wyglada index.php/400
Wszystko u mnie dziala, doszedlem jednak do wniosku ze jesli zmienie reguly routingu potrzebna bedzie tez zmiana tworzenia linkow, czyli ktory segment ma pobierac defaultowo jest to segment 4 a po dynamicznym routingu mam segment nr 0.
Za kazdym razem musze ingerowac w kod widoku(tam gdzie tworze odnosniki do wpisu) jak mozna takie cos osiagnac autmatycznie?


Właśnie dlatego zrezygnowałem z tego typu zadań obliczania pozycji po URI, bo wprowadza to niepotrzebny zamęt. Routing jest stały, nie zmieniasz go w żaden sposób dynamiczne, dlatego u mnie wystarczy napisać:

  1. 'page(add|del|read),([0-9]){1,4}' =>
  2. array('param_type' => array('$1' => '1', '$2' => 4) // tu ustalam co ma być dla poszczególnych grup wyrażenia
  3. );

Dla domyślnego ustawienia można napisać nowe wyrażenie, lub załatwić to już z poziomu modelu, skoro i tak odwołujemy się do metody.

Generowanie linków... tu szału nie ma, ponieważ link generowany jest na podstawie danych np. "/page/add,400" i do niego są doklejane potrzebne informacje np. język "/pl/add,400" wszytko do ustalenia z poziomu cfg
marcio
Tak zgadzam sie z toba ze nie jest to najlepsze rozwiazanie, poki co przychodzi mi do glowy ustawienie w konfiguracji np:
  1. <ref_read_segment>0</ref_read_segment>

Wtedy przy tworzeniu linku zrobie:
  1. $this -> uri -> getSegment($config -> ref_read_segment);

Wtedy moge "dynamicznie" zrobic tworzenie linkow(niezaleznie jak bedzie wygladal routing) i przekazywanie parametrow tez bedzie dynamiczne a w routingu zostawic tak jak ja chce, wtedy przy zmianie routingu trzebaby bylo zmienic tez nr segmentu dla danej akcji.

Dlaczego tak kombinuje...?!?

U ciebie w fw zapewnie wyglada to jak w Kohana, czyli jesli kontroler dostaje parametry to dana akcja dostaje je w deklaracji metody czyli:
  1. class Article_Controller extends Controller
  2. {
  3. public function index()
  4. {
  5. echo 'Hello World!';
  6. }
  7.  
  8. public function overview()
  9. {
  10. echo 'Article list goes here!';
  11. }
  12.  
  13. public function view($title,$id)
  14. {
  15. echo $id . ' - ' . $title;
  16. // you'd retrieve the article from the database here normally
  17. }
  18. }

Oczywiscie zgaduje, powiec mi jesli sie myle.
U mnie jednak parametry tez sa pobierane za pomoca uri/get/post a nie odrazu do deklaracji akcji(metody) kontrolera...wiec tez nie moge zbytnio zrobic tak jak bym chcial...
Quantum
U mnie na przykład w fw parametry, które wygeneruje mi router wrzucam do obiektu Request (tak samo jak post/get itd.), który dispatcher wciśnie do głównego kontrolera razem z obiektem Response.

  1. $param1 = $this -> request -> parameters -> param1;


standardowo linki wyglądaja tak: /kontroler/akcja/param1:wartosc/param2:wartosc, a jak chciałbym zmienić na ładniejsze linki:

  1. <route>
  2. <regexp>aktualnosci/([a-z]+)</regexp>
  3. <path>news/show_by_cat/id:$1</path>
  4. </route>

nie rozróżniam tego na statyczne/dynamiczne, tam gdzie chce regex to jest regex, jak nie ma to jest statyczne. Mógłbym jeszcze ścieżkę rozbić na kontroler/akcje/parametry, ale na tę chwilę nie ma z tym tragedii smile.gif
marcio
Tak rozumiem...jednak u ciebie wyglada to tak: /controller/action/args1:val1/args2:val2 i np taki url: /controller/action/args2:val2/args1:val1 jest jednoznaczny, poniewaz nie opierasz sie na argumentach "pozycyjnych"(jesli mozna to tak nazwac) pobierasz wartosc argumentu za pomoca jego nazwy czyli nie wazne w jakiej kolejnosci je podasz tak czy siak dostaniesz to co chciales, u mnie jednak ich kolejnosc jest wazna...

Wiec moje pytanie jest nastepujace.
Jak zbudowac router i routing tak zeby tworzenie url-ow bylo niezalezne?
To znaczy moze jasniej gdy nie mam ustawiongo zadnego routingu dla komponentu news to zeby odczytac wpis trzeba wklepac index.php/Home,Index,readNews,id i tak wyglada link generowany przez komponent news.

Teraz powiedzmy ze chcialbym zmienic to na krotszy link(patrz tablice routingu z poprzedniego posta) czyli dostajemy taki link index.php/id i otrzymamy to samo bo odpali sie ten sam frontcontroller,akcja i akcja komponentu jednak musze ingerowac w kod kontrolera komponentu news zeby generowal ten krotki(drugi link) zamiast tego dlugiego....jak zrobic by generowanie linkow bylo spojne z routerem?

Nie wiem czy sie wyrazilem...moze ktos z was podac jakis "jasny" przyklad?
!*!
Cytat
u mnie jednak ich kolejnosc jest wazna...


To jest jest właśnie ten cały mankament.

Cytat
Jak zbudowac router i routing tak zeby tworzenie url-ow bylo niezalezne?
To znaczy moze jasniej gdy nie mam ustawiongo zadnego routingu dla komponentu news to zeby odczytac wpis trzeba wklepac index.php/Home,Index,readNews,id i tak wyglada link generowany przez komponent news.


Nie bardzo rozumiem, dlaczego router miałby nie być określony? Dla mnie router to jeden z głównych fundamentów aplikacji, więc jako projektant, trudno abym o czymś zapomniał.

Chodzi Ci o brak parametrów? To albo ustawiasz dodatkowy routing i nadajesz mu domyślną wartość tu: dla index.php/id lub robisz dokładnie to samo, tylko z poziomu modelu stwierdzasz brak parametru.

Cytat
jak zrobic by generowanie linkow bylo spojne z routerem?


Zacznijmy od tego że powinieneś to gdzies ustalić jakie linki mają być generowane np. w cfg.

U mnie wygląda to mniej więcej tak

Kod
':lang?strona/:id' // gdzie :lang to wartość dla opcji językowej która może występować lecz nie musi, a :id to po prostu id artu


generowanie linku wygląda w ten sposób, że jeśli router odebrał :lang i taka wersja występuje w tablicy, jest ona zwracana, czyli doklejana do linku tam gdzie występuje http://domena/en_uk/ następnie idzie dalej i jeśli :id pasuje to tego co zdefiniowałem, i jest liczbą to przekazuje http://domena/en_uk/strona/123 zresztą to może kiepski przykład. Chodzi mi o to że linki, tzn. zawsze odbierasz jakieś dane np. z bazy o wybranym newsie np. /news/123 i na tej podstawie doklejasz to do wersji językowej, bo to tylko ona jest zmienną w adresach i trudno żeby było co innego. Po prostu musisz zdefiniować gdzieś, jak te linki mają wyglądać, u mnie jest to router i częściowo cfg.

I z Twoim przykładem, u mnie wyglądałoby to tak

  1. return array(
  2. 'news\/read/([0-9])' => array(
  3. 'controller' => 'News',
  4. 'method' => 'read',
  5. 'param' => '$1'
  6.  
  7. 'news\/([0-9])' => array(
  8. 'controller' => 'News',
  9. 'method' => 'read',
  10. 'param' => '$1' //
  11. );
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.