2 votes

Routage d'URL basé sur un commutateur en PHP

Voici ce que je fais actuellement :

J'ai un $path qui est tout ce qui se trouve après index.php/ (que je cache avec .htaccess) jusqu'à un point d'interrogation pour ignorer la chaîne de recherche.

Ensuite, j'utilise un switch con preg_match sur cette variable pour déterminer quel script il doit appeler. Par exemple :

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

  ...  

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

De cette façon, je peux accéder à l'identifiant du produit en utilisant simplement $params['id'] et, si nécessaire, utiliser la chaîne de recherche pour le filtrage, la pagination, etc.

Y a-t-il quelque chose de mal dans cette approche ?

4voto

Gumbo Points 279147

Vous ne devriez pas utiliser switch comme ça.

Mieux vaut utiliser un tableau et foreach comme :

$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';
}

0voto

Poelinca Dorin Points 5491

La mauvaise pièce serait le boîtier du commutateur. Comme meilleure pratique, je vous suggère de stocker toutes les regex dans un tableau et de le tester avec cela. Il serait plus facile de sauvegarder les routes dans un fichier de configuration, ou un fichier ini ou une base de données ou xml ou tout ce qui vous rendra la vie plus facile à long terme (si vous avez besoin de modifier / ajouter / supprimer de nouvelles routes).

Dans la deuxième partie, vous pourriez utiliser la fonction php parse_url au lieu de regex, ce qui accélérerait un peu votre script.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X