Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak dział router?
Forum PHP.pl > Forum > PHP
MESSIAH :)
Mam problem ze zrozumieniem routeringu w php. Tu jest skrypt routera który chciałbym użyć. Gdy użyję kodu od autora:
  1. <?php
  2.  
  3. require '/path/to/vendor/autoload.php';
  4.  
  5. $dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) {
  6. $r->addRoute('GET', '/user/{id:\d+}', 'handler1');
  7. $r->addRoute('GET', '/user/{id:\d+}/{name}', 'handler2');
  8. // Or alternatively
  9. #$r->addRoute('GET', '/user/{id:\d+}[/{name}]', 'common_handler');
  10. });
  11.  
  12. // Fetch method and URI from somewhere
  13. $httpMethod = $_SERVER['REQUEST_METHOD'];
  14. $uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
  15.  
  16. $routeInfo = $dispatcher->dispatch($httpMethod, $uri);
  17. switch ($routeInfo[0]) {
  18. case FastRoute\Dispatcher::NOT_FOUND:
  19. // ... 404 Not Found
  20. break;
  21. case FastRoute\Dispatcher::METHOD_NOT_ALLOWED:
  22. $allowedMethods = $routeInfo[1];
  23. // ... 405 Method Not Allowed
  24. break;
  25. case FastRoute\Dispatcher::FOUND:
  26. $handler = $routeInfo[1];
  27. $vars = $routeInfo[2];
  28. // ... call $handler with $vars
  29. break;
  30. }

Wtedy $routeInfo zawsze jest pusty. Czy pomoże mi ktoś zrozumieć zasady działania tego Routera? Czy muszę użyć przekierowań w pliku .htaccess? Chciałbym wiedzieć jak definiowane są linki oraz jak je odbierać.
Pyton_000
Tak, musisz wszystkie requesty rzucić na router czyli .htaccess lub konfiguracja vhosts
MESSIAH :)
Czy jest jakiś uniwersalny request dla .htaccess? Niestety autor skryptu nic nie wspomniał o tym pliku aby go użyć. Jak powinien wyglądać .htaccess dla tego skryptu?
Pyton_000
pewnie:
Kod
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^?]*)$ /index.php [NC,L,QSA]
freemp3
Skoro wyświetla się jakikolwiek wynik, nawet pusty, to znaczy, że żądanie leci przez router smile.gif
Pokaż jak to zaimplementowałeś u siebie. Na szybko ściągnąłem ten router, użyłem kodu z przykładu i działa poprawnie.
MESSIAH :)
Cytat(freemp3 @ 31.08.2015, 14:09:27 ) *
Skoro wyświetla się jakikolwiek wynik, nawet pusty, to znaczy, że żądanie leci przez router smile.gif
Pokaż jak to zaimplementowałeś u siebie. Na szybko ściągnąłem ten router, użyłem kodu z przykładu i działa poprawnie.

Użyłem kodu z przykładu (patrz pierwszy post). Wiem że wszystko leci jak powinno lecz nie wiem jak się odnieść do zdefiniowanego url. W przykładzie jest "/user" a gdy ja próbuje otworzyć url "http://localhost/projekt/xxx/user" to pokazuje 404 nie znaleziono. Więc jak działa ten ruter z np: parametrami po pytajniku lub z "/user/id/name"
sazian
dodaj RewriteBase /projekt/xxx/ po RewriteEngine on
MESSIAH :)
  1. RewriteEngine on
  2. RewriteBase /projekt/xxx/
  3. RewriteCond %{REQUEST_FILENAME} !-f
  4. RewriteCond %{REQUEST_FILENAME} !-d
  5. RewriteRule ^([^?]*)$ /index.php [NC,L,QSA]


Gdy wpisze adres: "http://localhost/projekt/xxx/user/12"
To ten kod przerzuca mnie do localhost root czyli "localhost/dashboard"

Z tego co rozumiem to ten kod:
  1. $r->addRoute('GET', '/user/{id:\d+}', 'handler1');
  2. $r->addRoute('GET', '/user/{id:\d+}/{name}', 'handler2');


Tworzy dwa adresy np:
http://localhost/projekt/xxx/user/12
http://localhost/projekt/xxx/user/12/kamil

Niestety nie działa mi to prawidłowo i nie wiem czemu.
freemp3
Nie działa ponieważ w $_SERVER['REQUEST_URI'] zapewne znajduje się taki adres: projekt/xxx/user/12, a router oczekuje takiego: user/12 smile.gif
MESSIAH :)
Kolego jesteś geniuszem !
Trzymaj pomógł.
Mam pytanie czemu autor o tym nie wspomniał?

Gdy już wszystko działa jak należy to co powinienem teraz zrobić? Na mój rozum to chyba powinienem zrobić obsługę switch i odwołać je do pliku:
  1. switch ($routeInfo[0]) {
  2. case FastRoute\Dispatcher::NOT_FOUND:
  3. require '404.php';
  4. // ... 404 Not Found
  5. break;
  6. case FastRoute\Dispatcher::METHOD_NOT_ALLOWED:
  7. $allowedMethods = $routeInfo[1];
  8. // ... 405 Method Not Allowed
  9. break;
  10. case FastRoute\Dispatcher::FOUND:
  11. $handler = $routeInfo[1];
  12. $vars = $routeInfo[2];
  13. require 'profile.php';
  14. // ... call $handler with $vars
  15. break;
  16. }

jak waszym zdaniem powinno to wyglądać? Czy nie będzie to kolidować z logiką?
freemp3
Autor o tym nie wspomniał bo zapewne założył (co jest z resztą logiczne), że router będzie wykorzystywany w głównym katalogu smile.gif W przypadku użycia jakiegokolwiek routera w podkatalogach, trzeba brać pod uwagę to, że w adresie znajduje się jeszcze dodatkowo ścieżka do katalogu, w którym jest skrypt.

Nie wiem jak inni, ale ja robię tak, że w routerze odczytuję tylko informację takie jak kontroler, akcja oraz jakieś dodatkowe parametry, a gdzieś dalej na podstawie tego ładuję odpowiedni plik oraz wywołuję klasę i metodę - o ile istnieją. Jeśli nie to jest ładowana strona błędu lub jakaś inna domyślna.
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.