Josselin Dionisi - Développeur indépendant

Écrire un routeur sans framework, en PHP natif

ionicons-v5-k Josselin Dionisi 31 mars 2025
142 lectures Niveau : intermédiaire

Bonjour et merci d’avoir cliqué sur cet article 😁

Aujourd’hui on va parler de code expérimental auquel je me suis intéressé récemment. Pour contextualiser, j’ai terminé un cours de PHP pour une promo que j’avais en tant que formateur.

Après avoir vu les bases et être arrivés au bout du programme, on a naturellement dévié vers la partie MVC et objets que l’on peut implémenter sur un projet en PHP natif.

C’est à ce moment là que je me suis ensuite posé la question de comment implémenter un routeur dans un projet de ce type en s’inspirant du fonctionnement de Symfony. 😉

On prend la route

Tout d’abord il faut avoir en tête le fonctionnement de base : une liste de routes, comprenez des url qui vont nous rediriger vers une méthode. Ces méthodes pourront ensuite se trouver dans une classe qui correspondrait à un controller pour faire nos actions.

Pour lister nos routes on peut facilement faire cela avec un tableau simple en PHP :

Ici le prefix est nécessaire en utilisant un serveur local type Wamp, MAMP, … car vos projets se trouvent dans un sous dossier exemple “www/projet-symfony/”. 😊

Entrons maintenant dans le cœur du sujet : créer une classe qui va pouvoir interpréter une URL, faire le matching vers le controller spécifié et déclencher la méthode associée.

On retrouve également notre tableau de routes passé dans le constructeur et ainsi on peut vérifier si chaque url atteinte correspond à l’une de nos méthodes écrites.

Vous remarquerez que j’utilise les namespace ici pour plus de clarté et également pour continier à écrire un router inspiré de Symfony. Pour les rendre disponible il faudra initialiser Composer dans votre projet

puis définir la règle PSR

A partir d’ici, avec une bonne configuration de votre serveur web Apache ou Nginx, vos URL devraient déclencher les méthodes de vos Controller définis. Nous avons donc un routing fonctionnel ! 😛

Changer le format de routing

YAML

“Ok ça fonctionne bien mais moi je suis habitué à écrire mes routes en YAML dans mes projets Symfony et pas en PHP !”

Aucun problème il suffit de créer un fichier routes.yaml et définir la même chose que dans notre fichier PHP.

Ensuite il faudra ajouter une méthode dans notre router pour pouvoir lire ce fichier et le convertir en tableau. PHP ne sachant pas interpréter directement du YAML.

Attributs

“Bon ok c’est très bien aussi, mais depuis PHP 8 et donc les dernières versions de Symfony on utilise aussi les attributs pour définir des routes. On peut faire ça avec ton router là ?”

Et oui ! C’est tout aussi faisable avec quelques manipulations complémentaires.

L’idée ici c’est que l’on va rajouter une méthode registerRoutes qui va aller directement parcourir les Controller existant pour récupérer les infos contenus dans les attributs PHP. On peut donc ensuite à nouveau créer un tableau de routes avec les infos décrites comme précédemment.
Côté Controller on écrira donc comme dans Symfony les attributs Route directement sur les méthodes associées

Vous pouvez maintenant supprimer vos anciens fichiers routes.php et routes.yaml ou les renommer en .old et vous verrez que votre router fonctionne toujours grâce à ces attributs. 😛

Conclusion

Nous avons donc maintenant un système de routing parfaitement fonctionnel et très inspiré de Symfony. Ce n’est pas à 100% le même mais il ne déroutera aucun développeur connaissant Symfony et ne requiert pas de configuration supplémentaire une fois en place.

J’ai surtout fait cette expérimentation à des fins pédagogiques car la question m’est venue suite à mon cours mais si vous travaillez sur un framework “maison” cela pourrait vous être utile.

En tous cas voici le repo Github et n’hésitez pas à me prévenir si vous l’utilisez réellement ! 😊

Sur ce, je vous dis à bientôt pour de nouvelles aventures 🚗 !