Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Router?
Forum PHP.pl > Forum > Przedszkole
aras785
Witam. Od jakiegoś czasu myślę nad zrobieniem routingu. Zrobiłem coś bardzo prostego i moje pytanie brzmi, czy takie coś jest poprawne?

  1. <?php
  2. $request = 'news-2';
  3. $route = array(
  4. 'news-([0-9])' => 'index/news/id/$1',
  5. 'pokaz' => 'index/news',
  6. );
  7.  
  8. foreach($route as $r => $key) {
  9. if(preg_match('/^'.$r.'$/i',$request)) {
  10. $router = preg_replace('/^'.$r.'$/i',$key,$request);
  11. }
  12. }
  13. echo $router;
Bateria
Nie ma czegoś takiego jak "poprawny" router z naszego punktu widzienia.
To od ciebie zależy jakie konkretnie ma on mieć zastosowanie; Zadaj sobie pytanie jak bardzo ma być zaawansowany itd.
Jeżeli uznasz że to co masz wystarczy, zamij się kwestią bezpieczeństwa i wtedy dopiero można go oceniać smile.gif
A napisać to można na kilkadziesiąt róznych sposobów.

Ale jak chcesz to mogę Ci na pw podesłać prostu routing z którego korzystam.
Szymciosek
Też jestem na etapie tworzenia i mam pytanie. Myślałeś jak uruchomić metodę z przekazaniem kilku argumentów do niej?

Tzn. tak jak u Ciebie
index -> uruchamia news

ale np niech będzie uri
/gallery/show/1/4/big
gdzie: 1,4,big to argumenty, które trzeba przekazać, początkowo są one array.

na razie doszedłem do tego:
$class->method($args);

no i w klasie:
  1. public function method($args)
  2. {
  3. var_dump($args);
  4. }


ale czy jest jakaś prosta możliwość przekazania np
$class->method($id, $num, $size)... questionmark.gif
aras785
@Szymciosek ja mam to rozwiązane tak:



  1. <?php
  2. namespace Lib;
  3. use Lib\Config;
  4. class Request {
  5. //vars define
  6. private $_controller;
  7. private $_action;
  8. private $_args = array();
  9. public function __construct() {
  10. //route from config
  11. $route = array(
  12. '\\/home' => 'index/index', //controller index, action: index
  13. );
  14.  
  15. foreach($route as $r => $key) {
  16. echo $r;
  17. if(preg_match('/^'.$r.'$/',$_SERVER['REQUEST_URI'])) {
  18. $_SERVER['REQUEST_URI'] = preg_replace('/^'.$r.'$/i',$key,$_SERVER['REQUEST_URI']);
  19. break;
  20. }
  21. }
  22. //end config route
  23. $parts = explode('/',$_SERVER['REQUEST_URI']);
  24. $parts = array_filter($parts);
  25.  
  26. $this->_controller = ($c = array_shift($parts))? $c : 'index';
  27. $this->_action = ($c = array_shift($parts))? $c : 'index';
  28. //param
  29. for($i=0;$i<count($parts);$i=$i+2) {
  30. $this->_args[$parts[$i]] = (isset($parts[$i+1]))?$parts[$i+1]:'';
  31. }
  32.  
  33. //args
  34. }
  35. public function getController() {
  36. return ucfirst(strtolower($this->_controller));
  37. }
  38. public function getAction() {
  39. return ucfirst(strtolower($this->_action));
  40. }
  41.  
  42. public function getParam($name=null) {
  43. if(array_key_exists($name,$this->_args)) {
  44. return $this->_args[$name];
  45. }
  46. }
  47. public function goUrl($url) {
  48. return header('location: '.strtolower($url));
  49. }
  50. }


I mnie pobiera argumenty na zasadzie "co drugi", czyli mam: index/index/id/2/idk/5 i funkcja getParam('id') => 2, getParam('idk')=>5.

Mam pytanie jak zrobić zeby przed "/" dodawało "\\" czyli w wyniku ma być: \\/
Szymciosek
No tak, ale tutaj raczej nadal operujesz na array, a mi chodziło o automatyczne rozbicie tych zmiennych do postaci takich jakie powinny mieć po przekazaniu do klas.

Tak ma np zrobione Symfony2.

/*
* @Route("/test/{var}/{id}")
*/
public function name($var, $id)...

tylko, że tutaj są akurat adnotacje, ale z linku od razu wiem, gdzie jest var i gdzie jest id.

Myślę, że dojdę do tego z czasem jeszcze.
aras785
U siebie daje w routerze:

  1. '/kategoria/([0-9])/strona/([0-9])' => 'kategoria/index/idk/$1/page/$2'


I otwierając sobie w adresie: kategoria/2/strona/9 to mogę sobie pobrac idk (2) i page(9)

To mi w zupełności wystarcza.
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.