Introducción: ¿por qué necesitas una API REST en PHP?
REST API (Representational State Transfer) es un estilo arquitectónico que permite que diferentes aplicaciones se comuniquen entre sí a través de HTTP. Hoy en día, ningún servicio web moderno prescinde de una API: aplicaciones móviles, frontends SPA, integraciones con sistemas de pago — todo esto requiere una interfaz rápida y comprensible para el intercambio de datos.
PHP sigue siendo uno de los lenguajes más populares para el backend. Puedes escribir una API REST completa en PHP puro sin frameworks pesados — esto te llevará no más de 30 minutos. En este artículo, analizaremos un ejemplo práctico con operaciones CRUD (crear, leer, actualizar, eliminar) para gestionar una lista de tareas (To-Do).
1. Preparación del entorno y estructura del proyecto
Para trabajar necesitarás:
- Un servidor local (Open Server, XAMPP, MAMP o el servidor PHP integrado)
- PHP versión 7.4 o superior
- Un editor de código (VS Code, PhpStorm)
Crea la carpeta raíz rest-api-php y dentro de ella los archivos:
rest-api-php/├── index.php (punto de entrada, enrutador)├── config.php (configuración de la base de datos)├── api/│ ├── tasks.php (CRUD para tareas)│ └── helpers.php (funciones auxiliares)└── .htaccess (redirección de solicitudes a index.php)1.1. Configuración de .htaccess para URLs limpias
Para que todas las solicitudes se dirijan a un único punto de entrada, crea el archivo .htaccess en la raíz:
RewriteEngine OnRewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^(.*)$ index.php [QSA,L]Si usas el servidor integrado de PHP, simplemente ejecútalo desde la carpeta del proyecto: php -S localhost:8000.
2. Creación del enrutador y la API base
Abre index.php — este es nuestro manejador principal. Analizará el método HTTP y la URI para llamar a las funciones necesarias.
2.1. index.php — punto de entrada
<?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, '/');
// Enrutamiento 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);}?>Manejamos dos rutas: /api/tasks (listar/crear) y /api/tasks/{id} (tarea específica).
2.2. helpers.php — funciones auxiliares
<?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. Trabajo con la base de datos y operaciones CRUD
Creemos una tabla simple tasks en 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);Archivo 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: