URL-reititin

empty 27.02.06 16:39

Mahdollistaa siistien url-parametrien käytön tyyliin index.php?hae/auto/lada

 Tekstiversio  Arvo: 7 (7 ääntä)  Äänestä: +  -
/*
 * Yksinkertainen mutta tehokas "url-reititin" (keksikää itse parempi nimitys),
 * ilman monimutkaisia ja hitaita regExp lauseita.
 * Tämä siis mahdollistaa siistien ja turvallisempien(käyttäjä ei näe minkä nimisiä parametreja sovellukselle välitetään) url-parametrien käytön.
 * Tyyliin:
 * http://www.palvelin.fi/index.php?nayta/paidat/eka
 * http://www.palvelin.fi/index.php?nayta/kengat/seuraava
 * http://www.palvelin.fi/index.php?nayta/lapaset/6
 * http://www.palvelin.fi/index.php?kori/lisaa/6
 *
 * Pitäisi olla suht helposti liitettävissä mihin tahansa(edes jotenkin järkevästi toteutettuun) sovellukseen.
 * Toimii varmaan  myös PHP4:llä kunhan muuttaa nuo luokan private määreet var:ksi ja konstruktorin muotoon function QueryRouter($queryString = false)
 */


//Edit-bugikorjaus: Tyhjä reitti ei toiminut.

class QueryRouter {
        private $routes = array ();
        private $query = null;
        function __construct($queryString = false) {
                if (!$queryString)
                        $queryString = $_SERVER['QUERY_STRING'];
                $this->query = empty ($queryString) ? array () : explode('/', rtrim($queryString, '/ '));

        }
        function route($route, $params = array ()) {
                $route = empty ($route) ? array () : explode('/', $route);
                if (($pcount = count($route)) != count($this->query)) {
                        return false;
                }
                for ($i = 0; $i < $pcount; $i ++) {
                        if (($pname = ltrim($route[$i], ':')) != $route[$i]) {
                                $params[$pname] = $this->query[$i];
                                continue;
                        }
                        if ($this->query[$i] != $route[$i])
                                return false;
                }
                return $params;

        }
        function add($route, $params = array ()) {
                $this->routes[$route] = $params;
        }

        function connect() {
                foreach ($this->routes as $route => $params) {
                        if ($result = $this->route($route, $params)) {
                                return $result;
                        }
                }
                return false;
        }

}

/********************** ESIMERKKI *************************/
$router = new QueryRouter();
$router->add('nayta/:kategoria/eka', array ('module' => 'haku', 'action' => 'hae', 'id' => '1'));
$router->add('nayta/:kategoria/seuraava', array ('module' => 'haku', 'action' => 'hae', 'kriteeri' => 'next'));
$router->add('nayta/:kategoria/:id', array ('module' => 'haku', 'action' => 'hae'));
$router->add('kori/lisaa/:id', array ('module' => 'ostoskori', 'action' => 'lisaa'));
$router->add('kori/poista/:id', array ('module' => 'ostoskori', 'action' => 'poista'));
$router->add(':module/:action/:id');
$router->add(':module/:action');
$router->add(':module', array ('action' => 'default'));
$router->add('', array ('module' => 'ostoskori', 'action' => 'default'));

$_GET = $router->connect();
print_r($_GET);
/*
 Esim. pyyntö www.palvelin.fi/index.php?nayta/rintaliivit/eka
 tulostaa:
Array
(
    [module] => haku
    [action] => hae
    [id] => 1
    [kategoria] => rintaliivit
)
 */

Akiro 17:22 27.2.06 
index.php? pois välistä vielä mod_rewritellä niin on pop, käyttäjille huomautuksena siis, ei ollut arvostelua tätä vastaan ;)
editoitu: 18:33 27.2.06
Ezku 18:31 27.2.06 
Ja se taas tehdään .htaccessilla näin:
   Options FollowSymLinks
   RewriteEngine On
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteRule ^(.*)$ index.php?path=$1 [QSA,L]
Tuo myös sijoittaa pyydetyn osoitteen GET-muuttujaan path, jotta sitä ei tarvitse kaivella jostain $_SERVERin uumenista.