Introdução: Por que você precisa de uma API REST em PHP?
REST API (Representational State Transfer) é um estilo arquitetural que permite que diferentes aplicações se comuniquem entre si via HTTP. Hoje, nenhum serviço web moderno pode funcionar sem uma API: aplicativos mobile, frontends SPA, integrações com sistemas de pagamento — tudo isso requer uma interface rápida e clara para troca de dados.
O PHP continua sendo uma das linguagens mais populares para desenvolvimento backend. Você pode escrever uma API REST completa em PHP puro, sem frameworks pesados — isso levará no máximo 30 minutos. Neste artigo, vamos percorrer um exemplo prático com operações CRUD (Create, Read, Update, Delete) para gerenciar uma lista de Tarefas.
1. Configuração do Ambiente e Estrutura do Projeto
Para isso você precisará de:
- Um servidor local (Open Server, XAMPP, MAMP ou o servidor PHP integrado)
- PHP versão 7.4 ou superior
- Um editor de código (VS Code, PhpStorm)
Crie uma pasta raiz rest-api-php e dentro dela os seguintes arquivos:
rest-api-php/├── index.php (ponto de entrada, roteador)├── config.php (configurações do banco de dados)├── api/│ ├── tasks.php (CRUD para tarefas)│ └── helpers.php (funções auxiliares)└── .htaccess (redirecionar requisições para index.php)1.1. Configurando .htaccess para URLs Limpas
Para rotear todas as requisições para um único ponto de entrada, crie um arquivo .htaccess na raiz:
RewriteEngine OnRewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^(.*)$ index.php [QSA,L]Se você estiver usando o servidor PHP integrado, basta executá-lo a partir da pasta do projeto: php -S localhost:8000.
2. Criando o Roteador e a API Básica
Abra o index.php — este é nosso manipulador principal. Ele irá analisar o método HTTP e a URI e chamar as funções necessárias.
2.1. index.php — Ponto 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, '/');
// Roteamento simplesif ($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 não encontrado'], 404);}?>Manipulamos duas rotas: /api/tasks (listar/criar) e /api/tasks/{id} (tarefa específica).
2.2. helpers.php — Funções 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. Trabalhando com o Banco de Dados e Operações CRUD
Vamos criar uma tabela tasks simples no 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);Arquivo 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: