GraphQL vs REST en PHP: ¿cuál elegir para tu proyecto en 2024?

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

GraphQL vs REST en PHP: ¿guerra de arquitecturas o herramientas para diferentes tareas?

\n\n

Cuando vuelves a abrir tu editor de código para escribir un nuevo endpoint para tu aplicación PHP, no puedes evitar sentir un déjà vu. ¿Otra vez crear un controlador? ¿Otra vez escribir validación? ¿O tal vez sea momento de probar algo nuevo? El debate entre GraphQL y REST en el mundo del desarrollo PHP recuerda a la eterna discusión entre «Laravel» y «Symfony»: cada quien defiende su stack a capa y espada. Pero seamos honestos: ambos enfoques no son una religión, sino herramientas. Hoy los desglosaremos pieza por pieza, veremos código real y decidiremos cuándo REST API en PHP es tu mejor opción y cuándo deberías considerar GraphQL en PHP.

\n\n

Breve introducción: ¿qué es cada uno?

\n\n

REST (Representational State Transfer) es un estilo arquitectónico basado en recursos y métodos HTTP. Accedes a /api/users y obtienes una lista de usuarios. Si quieres uno en específico, agregas /api/users/42. Todo es lógico, predecible y sencillo.

\n\n

GraphQL es un lenguaje de consultas creado por Facebook. No estás atado a las URL. Envías una sola solicitud a un único endpoint (por ejemplo, /graphql) y dices: «Dame el nombre del usuario 42, sus últimos 5 posts y la cantidad de likes de cada uno». El servidor devuelve exactamente lo que pediste. Ni un byte de más.

\n\n

Parecería que GraphQL gana por puntos. Pero no te apresures a descartar el clásico REST. Ambos tienen sus trampas, especialmente en el contexto del desarrollo en PHP.

\n\n

Comparativa de arquitecturas: de la teoría al código

\n\n

REST: el clásico de siempre

\n\n

En PHP, REST se implementa mediante enrutamiento. Frameworks como Laravel o Symfony lo hacen de forma elegante. Ejemplo de un controlador REST típico en Laravel:

\n\n
<?php\n\nnamespace App\\Http\\Controllers\\Api;\n\nuse App\\Models\\User;\nuse Illuminate\\Http\\Request;\n\nclass UserController extends Controller\n{\n    public function index()\n    {\n        return User::all();\n    }\n\n    public function show($id)\n    {\n        $user = User::with('posts.comments')->findOrFail($id);\n        return response()->json($user);\n    }\n\n    public function store(Request $request)\n    {\n        $validated = $request->validate([\n            'name' => 'required|string',\n            'email' => 'required|email|unique:users',\n        ]);\n\n        $user = User::create($validated);\n        return response()->json($user, 201);\n    }\n}
\n\n

Las ventajas son obvias: simplicidad en el caché (caché HTTP, Varnish), estructura de URL clara y amplio soporte de herramientas (Postman, Swagger). Las desventajas: el problema de over-fetching y under-fetching. Si el frontend solo necesita los nombres de los usuarios y tú devuelves todos los campos del modelo, eso es over-fetching. Si necesita el nombre y la lista de amigos, y haces dos solicitudes, eso es under-fetching.

\n\n

GraphQL: flexibilidad con truco

\n\n

Para implementar GraphQL en PHP existen excelentes librerías: webonyx/graphql-php (PHP puro) y lighthouse-php/lighthouse (para Laravel). Ejemplo de esquema y resolver con graphql-php:

\n\n
<?php\n\nuse GraphQL\\GraphQL;\nuse GraphQL\\Type\\Definition\\ObjectType;\nuse GraphQL\\Type\\Definition\\Type;\nuse GraphQL\\Type\\Schema;\n\n$userType = new ObjectType([\n    'name' => 'User',\n    'fields' => [\n        'id' => Type::int(),\n        'name' => Type::string(),\n        'email' => Type::string(),\n        'posts' => [\n            'type' => Type::listOf($postType),\n            'resolve' => function ($user) {\n                return getPostsByUserId($user['id']);\n            }\n        ],\n    ],\n]);\n\n$queryType = new ObjectType([\n    'name' => 'Query',\n    'fields' => [\n        'user' => [\n            'type' => $userType,\n            'args' => [\n                

Blogs

Book Recommendations