Introdução: REST ou GraphQL — a batalha eterna por velocidade e flexibilidade
\nOlá, desenvolvedor! Se você já escreveu uma API em PHP, certamente já enfrentou o dilema: usar o clássico REST ou o moderno GraphQL. Ambas as abordagens resolvem o mesmo problema — transferência de dados entre cliente e servidor — mas fazem isso de maneiras radicalmente diferentes.
\nO REST foi o padrão de facto por muitos anos: simples, intuitivo, previsível. Mas com o aumento da complexidade dos frontends (React, Vue, aplicativos móveis), os desenvolvedores reclamam cada vez mais de overfetching (muitos dados na resposta) e underfetching (necessidade de fazer várias requisições para reunir as informações necessárias). É aqui que entra o GraphQL — uma linguagem de consulta que dá ao cliente controle sobre quais dados receber.
\nNeste artigo, não vamos apenas listar teoria. Vamos pegar projetos PHP reais (Laravel e Symfony), escrever código e ver o que é mais rápido e o que é mais conveniente. Vamos lá!
\n\n1. REST API em PHP: o clássico que não morre
\nComo funciona
\nREST (Representational State Transfer) é um estilo arquitetural onde cada recurso (usuário, artigo, comentário) tem seu próprio URL. O cliente envia requisições HTTP (GET, POST, PUT, DELETE) e o servidor retorna uma estrutura de dados fixa, geralmente em JSON.
\nExemplo de um endpoint REST típico em PHP (sem framework):
\n// index.php - API REST simples\nheader('Content-Type: application/json');\n\n$method = $_SERVER['REQUEST_METHOD'];\n$uri = $_SERVER['REQUEST_URI'];\n\nif ($method === 'GET' && $uri === '/api/users') {\n $users = [\n ['id' => 1, 'name' => 'Alexey', 'email' => 'alex@example.com'],\n ['id' => 2, 'name' => 'Maria', 'email' => 'maria@example.com']\n ];\n echo json_encode($users);\n}\n\nEm Laravel fica ainda mais simples:
\n// routes/api.php\nRoute::get('/users', function () {\n return User::all(); // Serializado automaticamente em JSON\n});\n\nPrós do REST
\n- \n
- Simplicidade de cache: Cache HTTP (ETag, Last-Modified) funciona nativamente. \n
- Facilidade de depuração: qualquer navegador ou curl mostra a resposta. \n
- Estabilidade: REST existe desde 2000, documentação e ferramentas (Postman, Swagger) são muito refinadas. \n
Contras do REST
\n- \n
- Overfetching: se o cliente precisa apenas do nome do usuário, ele ainda recebe email, telefone, endereço. \n
- Problema N+1: para obter um usuário e seus posts, são necessárias duas requisições (GET /users/1, GET /users/1/posts). \n
2. GraphQL em PHP: quando o cliente é rei
\nComo funciona
\nGraphQL não é um banco de dados, mas uma camada entre o cliente e o servidor. O cliente envia uma requisição POST para um único endpoint (geralmente /graphql) com um corpo de consulta descrevendo quais campos e relações são necessários. O servidor retorna exatamente o que foi solicitado — nem um byte a mais.
Exemplo de implementação em PHP com a biblioteca webonyx/graphql-php:
\n// schema.php\nuse GraphQL\\Type\\Definition\\ObjectType;\nuse GraphQL\\Type\\Definition\\Type;\n\n$userType = new ObjectType([\n 'name' => 'User',\n 'fields' => [\n 'id' => Type::int(),\n 'name' => Type::string(),\n 'email' => Type::string(),\n ]\n]);\n\n$queryType = new ObjectType([\n 'name' => 'Query',\n 'fields' => [\n 'user' => [\n 'type' => $userType,\n 'args' => ['id' => Type::int()],\n 'resolve' => function ($root, $args) {\n return findUserById($args['id']); // Sua lógica\n }\n ]\n ]\n]);\n\nE agora a consulta do cliente:
\n// Cons