Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Jak dział router?
MESSIAH :)
post
Post #1





Grupa: Zarejestrowani
Postów: 249
Pomógł: 0
Dołączył: 22.12.2011

Ostrzeżenie: (10%)
X----


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ć.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 10)
Pyton_000
post
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Tak, musisz wszystkie requesty rzucić na router czyli .htaccess lub konfiguracja vhosts

Ten post edytował Pyton_000 31.08.2015, 13:23:13
Go to the top of the page
+Quote Post
MESSIAH :)
post
Post #3





Grupa: Zarejestrowani
Postów: 249
Pomógł: 0
Dołączył: 22.12.2011

Ostrzeżenie: (10%)
X----


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





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


pewnie:
Kod
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^?]*)$ /index.php [NC,L,QSA]
Go to the top of the page
+Quote Post
freemp3
post
Post #5





Grupa: Zarejestrowani
Postów: 467
Pomógł: 77
Dołączył: 6.09.2008
Skąd: Miechów / Kraków

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


Skoro wyświetla się jakikolwiek wynik, nawet pusty, to znaczy, że żądanie leci przez router (IMG:style_emoticons/default/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.
Go to the top of the page
+Quote Post
MESSIAH :)
post
Post #6





Grupa: Zarejestrowani
Postów: 249
Pomógł: 0
Dołączył: 22.12.2011

Ostrzeżenie: (10%)
X----


Cytat(freemp3 @ 31.08.2015, 14:09:27 ) *
Skoro wyświetla się jakikolwiek wynik, nawet pusty, to znaczy, że żądanie leci przez router (IMG:style_emoticons/default/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"
Go to the top of the page
+Quote Post
sazian
post
Post #7





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

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


dodaj RewriteBase /projekt/xxx/ po RewriteEngine on
Go to the top of the page
+Quote Post
MESSIAH :)
post
Post #8





Grupa: Zarejestrowani
Postów: 249
Pomógł: 0
Dołączył: 22.12.2011

Ostrzeżenie: (10%)
X----


  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.

Ten post edytował MESSIAH :) 31.08.2015, 17:14:50
Go to the top of the page
+Quote Post
freemp3
post
Post #9





Grupa: Zarejestrowani
Postów: 467
Pomógł: 77
Dołączył: 6.09.2008
Skąd: Miechów / Kraków

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


Nie działa ponieważ w $_SERVER['REQUEST_URI'] zapewne znajduje się taki adres: projekt/xxx/user/12, a router oczekuje takiego: user/12 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
MESSIAH :)
post
Post #10





Grupa: Zarejestrowani
Postów: 249
Pomógł: 0
Dołączył: 22.12.2011

Ostrzeżenie: (10%)
X----


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





Grupa: Zarejestrowani
Postów: 467
Pomógł: 77
Dołączył: 6.09.2008
Skąd: Miechów / Kraków

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


Autor o tym nie wspomniał bo zapewne założył (co jest z resztą logiczne), że router będzie wykorzystywany w głównym katalogu (IMG:style_emoticons/default/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.
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: 15.09.2025 - 11:29