Comment construire un système de routage basique côté serveur en PHP.

Pris par Aaron Sekisambu

Dans le contexte d'une application Web côté serveur, un système de routage est la partie de l'application Web qui mappe une demande HTTP à un gestionnaire de demandes (fonction / méthode). Une requête HTTP comprend un en-tête et éventuellement un corps. L'en-tête contient des informations sur la demande, par exemple la méthode, le chemin d'accès et l'hôte. Certaines méthodes telles que GET, HEAD et OPTIONS n'utilisent pas le corps de la demande, tandis que d'autres telles que POST, PUT et PATCH l'utilisent pour transmettre des données d'un client à un serveur.

L'utilisation d'un système de routage nous permet de mieux structurer notre application au lieu de désigner chaque demande dans un fichier.

Un système de routage fonctionne en mappant une requête HTTP à un gestionnaire de requêtes en fonction de la méthode de requête et du chemin spécifié dans l'URL de la requête. C'est exactement ce que nous allons construire dans ce tutoriel.

Exigences.

  • Vous avez besoin de PHP version 5 ou supérieure sur votre ordinateur de développement.
  • Connaissance de base de PHP, y compris la connaissance des variables globales PHP.
  • Une compréhension de PHP orienté objet.

Avertissement.

  • Ce routeur ne gérera que les requêtes GET et POST.
  • Je ne vais pas utiliser des outils et des bibliothèques sophistiqués. Pas de compositeur, pas de chargement automatique. Je veux rester concentré sur le concept.
  • Les tests unitaires sont excellents, mais je ne vais pas le faire pour que ce didacticiel soit court. (Désolé bons développeurs)
  • Le code que je vais écrire n'est pas un code prêt à la production.

Commençons.

À l'aide du terminal, créez un dossier pour le projet et insérez-le dans le dossier.

$ mkdir php-router
$ cd php-router

Créez 4 fichiers dans le dossier comme indiqué ci-dessous.

$ touch index.php Request.php IRequest.php Router.php

index.php - Ceci est le fichier d'entrée de l'application Web. C’est là que nous allons initialiser le routeur et définir nos routes. Il doit également contenir toutes les importations.

Request.php - Ce fichier contiendra une classe pour la classe Request permettant d'initialiser des objets contenant des informations sur la requête HTTP.

IRequest.php —Ce fichier contiendra l'interface que la classe Request doit implémenter.

Router.php - Ce fichier contiendra la classe Router.

Avant d’écrire le routeur, nous devons concevoir son API (comment il sera utilisé dans les applications). Ci-dessous, l'API pour notre routeur.

$ routeur = nouveau routeur;
// Comment les requêtes GET seront définies
$ routeur-> get ('/ some / route', fonction ($ request) {
    // L'argument $ request du rappel
    // contiendra des informations sur la demande
    retourne "Contenu";
});
// Comment les requêtes POST seront définies
$ routeur-> post ('/ some / route', fonction ($ request) {
    // Comment obtenir les données du corps de la requête
    $ body = $ request-> getBody ();
});

Maintenant que nous avons défini la manière dont notre routeur sera utilisé, créons-le.

Créez la classe Request.

Tout d’abord, définissez l’interface que la classe Request concrète implémentera. Dans IRequest.php, définissez l'interface IRequest.

getBody () extrait les données du corps de la requête. La classe Request doit avoir l'implémentation pour cette méthode.

Créez la classe Request.

Dans le constructeur, appelez bootstrapSelf () - une méthode qui définit toutes les clés du tableau global $ _SERVER en tant que propriétés de la classe Request et leur attribue également des valeurs. Cette méthode appelle la méthode toCamelCase ().

La méthode toCamelCase () convertit une chaîne de casse de serpent en casse de chameau.

getBody () est une implémentation de la méthode définie dans l'interface IRequest.

Créez la classe de routeur.

Dans Router.php, ajoutez le code suivant pour le routeur.

Dans le constructeur de la classe Router, conservez une référence à sa dépendance, l’objet Request.

Utilisons la méthode magique PHP __call (). Cette méthode est déclenchée lors de l'appel de méthodes inaccessibles dans un contexte d'objet.

Prenons l'exemple de code ci-dessous.

Nous essayons d'appeler la méthode get () qui n'est pas définie dans la classe Router. La méthode magique __call () est donc déclenchée. Il reçoit deux arguments. Le premier argument est le nom de la méthode (‘get’) et le second est un tableau d’arguments dans lequel la méthode get () a été invoquée avec i.e ['/ ’, function () {}].

Nous utilisons la méthode magique __call () pour créer de manière dynamique un tableau associatif qui mappe des itinéraires à des rappels. Nous en créons une pour chaque méthode de demande prise en charge. Si une méthode non valide est appelée sur l'objet routeur, nous répondons avec une méthode 405 non autorisée.

La méthode resolve () sélectionne un rappel appelé pour traiter une requête en fonction de la méthode HTTP et du chemin d’accès de la requête (‘/’, ‘/ foo / bar’, etc.).

Maintenant que nous avons notre routeur, utilisons-le pour créer une application.

Créez une application.

Dans index.php, importez les classes Request et Router que nous avons définies, initialisez un routeur et définissez certaines routes.

Exécutez et testez manuellement l'application.

Utilisons le serveur de développement de PHP pour exécuter l’application sur le port 8000.

Dans le terminal, accédez au dossier du projet et exécutez la commande suivante.

$ php -S 127.0.0.1:8000

Ouvrez votre navigateur Web et accédez à http: // localhost: 8000 / et à http: // localhost: 8000 / profile pour tester les pages d'accueil et de profil.

Utilisez Postman ou curl (ou tout autre outil de votre choix) pour tester l'itinéraire POST vers http: // localhost: 8000 / profile.

Voici une capture d'écran de mon test en utilisant postman.

POST / travaux de donnéesDELETE / data renvoie 405 Méthode non autorisée

Dernières pensées.

PHP supporte actuellement mal les méthodes HTTP permettant l'envoi de données dans le corps de la requête, autres que POST (c'est-à-dire PUT, DELETE, PATCH, etc.).

Vous devez utiliser php: // input (un flux d'entrée en lecture seule) pour lire les données brutes du corps de la demande, puis les analyser dans une paire clé-valeur.

Avez-vous besoin de recruter les meilleurs développeurs? Parlez à Andela pour vous aider avec ça.