Biblioteca GraphQL PHP: webonyx/graphql-php
En el desarrollo web moderno, cada vez surge más la necesidad de API flexibles y eficientes. Los servicios REST tradicionales a menudo sufren de carga de datos excesiva o insuficiente. GraphQL es un lenguaje de consultas y un entorno de ejecución creado por Facebook que permite a los clientes solicitar exactamente los datos que necesitan. Para PHP, una de las implementaciones más populares es la biblioteca webonyx/graphql-php.
Esta biblioteca proporciona un conjunto completo de herramientas para construir servidores GraphQL en PHP: desde la definición del esquema de tipos hasta el procesamiento de consultas complejas con relaciones anidadas. Es ideal para crear API modernas para aplicaciones web, aplicaciones móviles y SPA (Single Page Applications).
Características principales de webonyx/graphql-php
- Soporte completo de la especificación GraphQL (junio de 2018): todos los tipos, directivas, variables y fragmentos.
- Sistema de tipos basado en objetos PHP: definición de tipos, interfaces, tipos unión y enumeraciones.
- Resolutores integrados: posibilidad de definir la lógica de obtención de datos para cada campo.
- Validación de consultas: verificación automática de sintaxis y tipos.
- Soporte de carga diferida: los datos se cargan solo cuando se solicitan.
- Compatibilidad con frameworks populares: Laravel, Symfony, Yii2 a través de paquetes envoltorio.
Instalación y configuración
La instalación se realiza a través de Composer:
composer require webonyx/graphql-phpPara funcionar, se requiere PHP 7.1+ con la extensión mbstring. Después de la instalación, crearemos un servidor simple.
Ejemplo: creación de un esquema GraphQL
Consideremos un ejemplo básico: obtener una lista de libros y autores. Primero, definimos los tipos:
<?phpuse GraphQL\\Type\\Definition\\ObjectType;use GraphQL\\Type\\Definition\\Type;use GraphQL\\Type\\Schema;
// Tipo "Author"$authorType = new ObjectType([ 'name' => 'Author', 'fields' => [ 'id' => Type::int(), 'name' => Type::string(), 'books' => [ 'type' => Type::listOf($bookType), // se definirá más adelante 'resolve' => function ($author) { // Supongamos que existe una función getBooksByAuthorId() return getBooksByAuthorId($author['id']); } ] ]]);
// Tipo "Book" (definido con cierre para referencias cíclicas)$bookType = new ObjectType([ 'name' => 'Book', 'fields' => function() use ($authorType) { return [ 'id' => Type::int(), 'title' => Type::string(), 'author' => [ 'type' => $authorType, 'resolve' => function ($book) { return getAuthorById($book['author_id']); } ] ]; }]);
// Tipo "Query"$queryType = new ObjectType([ 'name' => 'Query', 'fields' => [ 'books' => [ 'type' => Type::listOf($bookType), 'resolve' => function() { return getAllBooks(); } ], 'author' => [ 'type' => $authorType, 'args' => [ 'id' => Type::nonNull(Type::int()) ], 'resolve' => function($root, $args) { return getAuthorById($args['id']); } ] ]]);
// Creamos el esquema$schema = new Schema([ 'query' => $queryType]);Procesamiento de la consulta
Ahora escribimos el código que recibe la consulta GraphQL y devuelve el resultado:
<?phpuse GraphQL\\GraphQL;use GraphQL\\Error\\DebugFlag;
// Obtenemos el cuerpo de la consulta de la en También en la biblioteca
Registro para Swift (iOS/macOS): mejores soluciones
PHPMailer para PHP: guía completa con ejemplos
Trabajo con imágenes en PHP: resize, crop y optimización con GD e Imagick
GraphQL para C# (.NET): Guía completa de la biblioteca GraphQL.NET
Contenedores de Inyección de Dependencias para Java: guía completa