2011-01-04 7 views
1

Was ich zur Zeit mache, ist dies:Switch-basierte URL-Routing in PHP

Ich habe eine $path Variable, die alles nach index.php/ (die ich mit .htaccess verstecken) bis zu einem Fragezeichen, um den Querystring zu ignorieren.

Dann verwende ich eine switch mit preg_match Fälle für diese Variable, um zu bestimmen, welches Skript es aufrufen sollte. Zum Beispiel:

switch (true) 
{ 
    case preg_match('{products/view/(?P<id>\d+)/?}', $path, $params): 
    require 'view_product.php'; 
    break; 

    ... 

    default: 
    require '404.php'; 
    break; 
} 

So kann ich die Produkt-ID zugreifen kann nur $params['id'] und, falls erforderlich, mit der Abfragezeichenfolgeflag zum Filtern, Paginieren usw.

Gibt es etwas falsch mit diesem Ansatz?

Antwort

3

Sie sollten switch nicht so verwenden.

Besser ein Array verwenden und foreach wie:

$rules = array(
    '{products/view/(?P<id>\d+)/?}' => 'view_product.php' 
); 
$found = false; 
foreach ($rules as $pattern => $target) { 
    if (preg_match($pattenr, $path, $params)) { 
     require $target; 
     $found = true; 
     break; 
    } 
} 
if (!$found) { 
    require '404.php'; 
} 
+1

Whoa. So einfach, nicht wahr? Danke, Alter. Scheint viel besser als mein Ansatz. :) – Ricky

0

Der falsche Teil der Schalter Fall wäre. Als bessere Praxis würde ich vorschlagen, dass Sie alle Regex in einem Array speichern und damit testen. Es wäre einfacher, die Routen in eine Konfigurationsdatei oder eine Ini-Datei oder Datenbank oder XML oder was auch immer zu speichern, damit Sie auf lange Sicht das Leben leichter machen (wenn Sie neue Routen bearbeiten/hinzufügen/löschen müssen).

Im zweiten Teil könnten Sie parse_url PHP-Funktion anstelle von Regex verwenden, die Geschwindigkeit wird Sie ein wenig skripten.

+0

Ich bin mir nicht sicher, ob ich verstehe, wie Sie parse_url in diesem Fall verwenden würden ... – Ricky