Ce projet à vocation pédagogique illustre une mise en œuvre simplifiée en PHP natif d'une API respectant en partie les contraintes architecturales REST.
Pour plus de détails sur les contraintes architecturales en question : Representational state transfer — Wikipédia.
- Implémentation en PHP natif sans dépendances tierces.
- Organisation selon un modèle en couches Model/Controller, le contrôleur étant en charge de la génération des réponses au format JSON.
- Gestion des erreurs personnalisées et journalisation des exceptions.
- Exemples d'opérations standards sur un jeu de données (modèle
User) :- GET
- POST
- PUT
- PATCH
- DELETE
- Authentification via JSON Web Token (JWT), voir :
MCD des entités user et refresh_token avec spécification des types MySQL.
-
Récupération de tous les utilisateurs :
GET /api/user
-
Récupération d'un utilisateur en fonction de son identifiant (
user.id) :GET /api/user/{id} -
Création d'un nouvel utilisateur :
POST /api/user/{id} -
Modification d'un utilisateur :
PATCH /api/user/{id} -
Remplacement d'un utilisateur :
PUT /api/user/{id} -
Suppression d'un utilisateur en fonction de son identifiant (
user.id) :DELETE /api/user/{id}
-
Connexion :
POST /api/user/login
-
Déconnexion :
POST /api/user/logout
-
Reconnexion (rafraîchissement du jeton d’accès) :
POST /api/user/token/refresh
Arborescence des répertoires et sous-répertoires :
├── public
│ ├── assets
│ ├── client.php
│ ├── front_controller.php
│ └── index.php
├── src
│ ├── Core
│ │ ├── Database.php
│ │ └── DotEnv.php
│ ├── Security
│ │ └── JwtService.php
│ ├── Controller
│ │ └── UserController.php
│ └── Model
│ └── User.php
├── helpers
│ ├── global_helper.php
│ ├── http_response_helper.php
│ └── jwt_helper.php
├── logs
└── stuff
Détails :
/public: Point d'accès public (assets, client jQuery), initialisation des variables d'environnement (.env: connexion à la base de données, configuration JWT) et chargement des composants nécessaires (index.php), et contrôleur frontal (front_controller.php, en charge du routage via l'analyse du format des requêtes ainsi que de la méthode (GET, POST, PATCH, etc.) utilisée par la requête)./src/Core: Composants du cœur applicatif./src/Security: Composants de sécurité (JWT)./src/Controller: Implémentation de la logique (analyse des requêtes, application des traitements, élaboration des réponses)./src/Model: Implémentation des opérations en base de données./helpers: Scripts utilitaires./logs: Destiné au stockage des fichiers de journalisation (ex. :error.log), ce dossier doit être créé manuellement (voir plus bas)./stuff: Fichiers et documents annexes.
- PHP 8.1 ou version supérieure.
- MySQL 8.0 ou version supérieure.
- Git.
-
Clonage du dépôt GitHub :
git clone git@github.com:El-Profesor/Native-PHP-RESTful-API.git native_php_restful_api -
Création de la base de données :
- Créer une base de données nommée
native_php_restful_api(par exemple). - Importer le script de création de la base de données (fichier
/stuff/native_php_restful_api.sql).
- Créer une base de données nommée
-
Configuration des paramètres de connexion à la base de données et des paramètres JWT (le fichier
/.envdoit être créé manuellement) :DB_HOST=localhost DB_USER= DB_PASS= DB_NAME=native_php_restful_api JWT_SECRET=my_secret_key_not_really_so_secret_please_change_me JWT_TTL=300 JWT_REFRESH_TTL=604800
-
Création d'un fichier de journalisation (logging) destiné à conserver une trace des exceptions PHP générées par l'application, avec permissions suffisantes (accès en écriture) :
cd native_php_restful_api mkdir logs touch logs/error.log chmod 777 logs/error.log -
Démarrage du serveur Web interne à PHP :
cd native_php_restful_api php -S localhost:8000 -t public -
Vérification du fonctionnement de l'application via un client HTTP (ex. : navigateur) : http://localhost:8000/api/user.
- Une réponse
{"status":"Error","message":"Method Not Allowed"}est tout à fait normale.
- Une réponse
-
Vérification du fonctionnement du client jQuery via un navigateur : http://localhost:8000/client.php.
Liste des codes utilisés (non exhaustive) :
- 400 - Bad Request : Le corps de la requête est vide ou des données requises sont manquantes.
- 401 - Unauthorized : L'utilisateur n'est pas authentifié.
- 403 - Forbidden : L'accès à la ressource demandée est interdit.
- 404 - Not Found : La route ou l'instance d'un modèle n'ont pu être trouvés.
- 405 - Method Not Allowed : La méthode utilisée par la requête (GET, POST, PATCH, etc.) n'est pas autorisée.
- 500 - Internal Server Error : Il s'agit d'une erreur interne du serveur non spécifiée.
- Etc.
Les codes d'état et messages associés (succès ou erreur) sont inclus à la réponse au format JSON afin de pouvoir traiter les cas particuliers côté client.
Pour le détail des codes d'état de réponse HTTP, voir : Liste des codes HTTP — Wikipédia.
La grande majorité des exceptions PHP générées côté serveur est journalisée dans le fichier /logs/error.log.
Ce fichier permet la surveillance de l'application en fonctionnement et constitue une aide pour l'identification de l'origine des exceptions PHP générées.
Ce dépôt a été conçu à des fins pédagogiques pour illustrer des concepts et des principes spécifiques. Le code n'est pas destiné à être utilisé en production, car il peut ne pas répondre aux exigences de sécurité, de qualité, de robustesse et de performance nécessaires dans un environnement professionnel. Il sert uniquement à des fins d'apprentissage et ne doit pas être considéré comme un modèle de développement. Ce code est donc fourni à des fins éducatives et sans engagement de performance ou de fiabilité.
Ce projet inspiré du projet FarrelAD/Basic-PHP-RESTful-API est open source et disponible sous licence MIT. N’hésitez pas à le modifier et à l’utiliser comme support d’apprentissage.
