Introducción a GraphQL y PHP
GraphQL es un lenguaje de consulta para APIs y un entorno de ejecución para ejecutar esas consultas con datos existentes. A diferencia de REST, donde obtienes una estructura de respuesta fija, GraphQL permite al cliente solicitar solo los datos que realmente necesita. Esto hace que la API sea más flexible y eficiente.
En este tutorial crearemos una API GraphQL simple en PHP desde cero. Aprenderás cómo instalar las bibliotecas necesarias, definir el esquema, escribir resolvers y procesar consultas. El artículo está dirigido a desarrolladores principiantes familiarizados con los fundamentos de PHP y bases de datos (por ejemplo, MySQL o SQLite).
Usaremos la biblioteca webonyx/graphql-php — es el paquete más popular y estable para implementar GraphQL en PHP. Al final, podrás ejecutar tu propio servidor GraphQL y realizar consultas a través de cualquier cliente HTTP (por ejemplo, cURL o Insomnia).
Instalación y configuración del proyecto
Paso 1: Creación del proyecto e instalación de dependencias
Primero, crea un nuevo directorio para el proyecto e inicializa Composer:
mkdir graphql-php-tutorialcd graphql-php-tutorialcomposer initLuego, instala la biblioteca webonyx/graphql-php:
composer require webonyx/graphql-phpTambién necesitaremos un servidor HTTP compatible con PSR-7. Para simplificar, usaremos el servidor PHP integrado y la biblioteca guzzlehttp/psr7 para trabajar con solicitudes y respuestas:
composer require guzzlehttp/psr7Paso 2: Estructura del proyecto
Crea la siguiente estructura de archivos:
index.php— punto de entrada de la aplicaciónschema.graphql— archivo con la definición del esquema GraphQLresolvers.php— archivo con las funciones resolverdata.php— simulación de base de datos (array con datos)
Definición del esquema GraphQL
Paso 3: Escritura del esquema
El esquema es la descripción de los tipos de datos y las operaciones disponibles (consultas y mutaciones). Crearemos un esquema simple para gestionar una lista de libros. Abre el archivo schema.graphql e inserta el siguiente código:
type Book { id: ID! title: String! author: String! year: Int}
type Query { books: [Book] book(id: ID!): Book}
type Mutation { addBook(title: String!, author: String!, year: Int): Book deleteBook(id: ID!): Book}Aquí hemos definido:
- Book — tipo de datos con los campos id, title, author y year.
- Query — operaciones para obtener datos: lista de todos los libros y libro por ID.
- Mutation — operaciones para modificar datos: agregar y eliminar un libro.
Paso 4: Preparación de datos y resolvers
Crea el archivo data.php con un array de libros:
<?php$books = [ 1 => ['id' => 1, 'title' => 'Guerra y Paz', 'author' => 'León Tolstói', 'year' => 1869], 2 => ['id' => 2, 'title' => 'Crimen y Castigo', 'author' => 'Fiódor Dostoyevski', 'year' => 1866],];Ahora escribimos los resolvers en el archivo resolvers.php. Los resolvers son funciones que devuelven datos para cada campo del esquema.
<?phprequire 'data.php';
function resolveBooks() { global $books; return array_values($books);}
function resolveBook($root, $args) { global $books; return $books[$args['id']] ?? null;}
function resolveAddBook($root, $args) { global $books; $newId = count($books) + 1; $newBook = [ 'id' => $newId, 'title' => $args['title'], 'author' => $args['author'], 'year' => $args['year'] ?? null ]; $books[$newId] = $newBook; return $newBook;}
function resolveDeleteBook($root, $args) { global $books;