Introduction : pourquoi une API REST en PHP ?
L'API REST (Representational State Transfer) est un style architectural qui permet à différentes applications de communiquer entre elles via HTTP. Aujourd'hui, aucun service web moderne ne se passe d'API : applications mobiles, fronts SPA, intégrations avec les systèmes de paiement — tout cela nécessite une interface rapide et claire pour échanger des données.
PHP reste l'un des langages les plus populaires pour le backend. Vous pouvez écrire une API REST complète en PHP pur sans frameworks lourds — cela ne vous prendra pas plus de 30 minutes. Dans cet article, nous allons détailler un exemple pratique avec des opérations CRUD (création, lecture, mise à jour, suppression) pour gérer une liste de tâches (To-Do).
1. Préparation de l'environnement et structure du projet
Pour travailler, vous aurez besoin de :
- Un serveur local (Open Server, XAMPP, MAMP ou serveur PHP intégré)
- PHP version 7.4 ou supérieure
- Un éditeur de code (VS Code, PhpStorm)
Créez le dossier racine rest-api-php et à l'intérieur, les fichiers :
rest-api-php/├── index.php (point d'entrée, routeur)├── config.php (paramètres de la base de données)├── api/│ ├── tasks.php (CRUD pour les tâches)│ └── helpers.php (fonctions auxiliaires)└── .htaccess (redirection des requêtes vers index.php)1.1. Configuration de .htaccess pour de belles URL
Pour que toutes les requêtes soient dirigées vers un point d'entrée unique, créez le fichier .htaccess à la racine :
RewriteEngine OnRewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^(.*)$ index.php [QSA,L]Si vous utilisez le serveur PHP intégré, lancez-le simplement depuis le dossier du projet : php -S localhost:8000.
2. Création du routeur et de l'API de base
Ouvrez index.php — c'est notre gestionnaire principal. Il analysera la méthode HTTP et l'URI pour appeler les fonctions appropriées.
2.1. index.php — point d'entrée
<?phpheader("Content-Type: application/json; charset=UTF-8");header("Access-Control-Allow-Origin: *");header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");header("Access-Control-Allow-Headers: Content-Type, Authorization");
require_once 'config.php';require_once 'api/helpers.php';
$method = $_SERVER['REQUEST_METHOD'];$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);$uri = rtrim($uri, '/');
// Routage simpleif ($uri === '/api/tasks') { require_once 'api/tasks.php'; handleTasks($method);} elseif (preg_match('/^\\/api\\/tasks\\/(\\d+)$/', $uri, $matches)) { require_once 'api/tasks.php'; handleTask($method, (int)$matches[1]);} else { sendResponse(['error' => 'Endpoint not found'], 404);}?>Nous traitons deux routes : /api/tasks (liste/création) et /api/tasks/{id} (tâche spécifique).
2.2. helpers.php — fonctions auxiliaires
<?phpfunction sendResponse($data, $status = 200) { http_response_code($status); echo json_encode($data, JSON_UNESCAPED_UNICODE); exit;}
function getJsonInput() { $input = file_get_contents('php://input'); return json_decode($input, true) ?? [];}?>3. Travail avec la base de données et opérations CRUD
Créons une table simple tasks dans MySQL :
CREATE TABLE tasks ( id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255) NOT NULL, status ENUM('pending', 'completed') DEFAULT 'pending', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);Fichier config.php :
<?php$host = 'localhost';$dbname = 'rest_api_db';$username = 'root';$password = '';
try { $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO: