Introducción: REST o GraphQL — la batalla eterna por la velocidad y la flexibilidad
\n¡Hola, desarrollador! Si alguna vez has escrito una API en PHP, seguramente te has enfrentado al dilema: usar el clásico REST o el moderno GraphQL. Ambos enfoques resuelven la misma tarea — la transferencia de datos entre el cliente y el servidor, pero lo hacen de maneras radicalmente diferentes.
\nREST durante muchos años fue el estándar de facto: simple, comprensible, predecible. Pero con el crecimiento de la complejidad de los frontends (React, Vue, aplicaciones móviles), los desarrolladores se quejan cada vez más del overfetching (demasiados datos en la respuesta) y el underfetching (necesidad de hacer varias solicitudes para recopilar la información necesaria). Aquí entra en escena GraphQL — un lenguaje de consultas que le da al cliente el control sobre qué datos obtener exactamente.
\nEn este artículo no solo enumeraremos teoría. Tomaremos proyectos PHP reales (Laravel y Symfony), escribiremos código y veremos qué funciona más rápido y qué es más conveniente. ¡Allá vamos!
\n\n1. API REST en PHP: un clásico que nunca muere
\nCómo funciona
\nREST (Transferencia de Estado Representacional) es un estilo arquitectónico donde cada recurso (usuario, artículo, comentario) tiene su propia URL. El cliente envía solicitudes HTTP (GET, POST, PUT, DELETE) y el servidor devuelve una estructura de datos fija, generalmente en JSON.
\nEjemplo de un endpoint REST típico en PHP (sin framework):
\n// index.php - API REST simple\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\nEn Laravel se ve aún más simple:
\n// routes/api.php\nRoute::get('/users', function () {\n return User::all(); // Se serializa automáticamente a JSON\n});\n\nVentajas de REST
\n- \n
- Simplicidad de caché: El caché HTTP (ETag, Last-Modified) funciona de fábrica. \n
- Facilidad de depuración: cualquier navegador o curl mostrará la respuesta. \n
- Estabilidad: REST existe desde el año 2000, la documentación y las herramientas (Postman, Swagger) están muy pulidas. \n
Desventajas de REST
\n- \n
- Overfetching: si el cliente solo necesita el nombre del usuario, igual recibe email, teléfono, dirección. \n
- Problema N+1: para obtener un usuario y sus publicaciones, se necesitan dos solicitudes (GET /users/1, GET /users/1/posts). \n
2. GraphQL en PHP: cuando el cliente es el rey
\nCómo funciona
\nGraphQL no es una base de datos, sino una capa entre el cliente y el servidor. El cliente envía una solicitud POST a un único endpoint (generalmente /graphql) con un cuerpo de consulta en el que describe qué campos y relaciones necesita. El servidor devuelve exactamente lo que se solicitó — ni un byte de más.
Ejemplo de implementación en PHP con la librería 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']); // Tu lógica\n }\n ]\n ]\n]);\n\nY ahora la consulta del cliente:
\n// Cons