GraphQL API con PHP: tutorial práctico paso a paso

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

Introducción a GraphQL con PHP: por qué vale la pena probarlo

\n\n

GraphQL es un lenguaje de consultas moderno para API, desarrollado por Facebook. A diferencia de REST, donde cada endpoint devuelve una estructura de datos fija, GraphQL permite al cliente solicitar solo los campos que necesita. Esto reduce el volumen de datos transferidos y simplifica el desarrollo de aplicaciones complejas.

\n\n

En este tutorial crearemos una API GraphQL completa en PHP utilizando la biblioteca webonyx/graphql-php. Aprenderás a definir el esquema, escribir resolutores, procesar consultas y mutaciones, y probar la API a través de GraphiQL.

\n\n

Se asume que tienes instalado PHP 8.0+ y Composer. Si no es así, comienza instalándolos.

\n\n

Instalación y configuración del proyecto

\n\n

Paso 1: Creación del proyecto e instalación de dependencias

\n\n

Crea un nuevo directorio para el proyecto e inicializa Composer:

\n\n
mkdir graphql-php-tutorial\ncd graphql-php-tutorial\ncomposer init
\n\n

Instala la biblioteca webonyx/graphql-php:

\n\n
composer require webonyx/graphql-php
\n\n

También instala nikic/fast-route para enrutamiento simple (opcional, pero conveniente):

\n\n
composer require nikic/fast-route
\n\n

Paso 2: Estructura del proyecto

\n\n

Crea la siguiente estructura de carpetas:

\n\n
graphql-php-tutorial/\n├── src/\n│   ├── Schema/\n│   │   └── schema.php\n│   ├── Resolvers/\n│   │   ├── QueryResolver.php\n│   │   └── MutationResolver.php\n│   └── Data/\n│       └── Database.php\n├── public/\n│   └── index.php\n├── vendor/\n└── composer.json
\n\n

Creación del esquema GraphQL

\n\n

Paso 3: Definición de tipos y esquema

\n\n

Crearemos un modelo de datos simple: usuario (User) y publicación (Post). Abre src/Schema/schema.php y agrega el siguiente código:

\n\n
<?php\n\nnamespace App\\Schema;\n\nuse GraphQL\\Type\\Definition\\ObjectType;\nuse GraphQL\\Type\\Definition\\Type;\nuse GraphQL\\Type\\Schema as GraphQLSchema;\n\nclass Schema\n{\n    public static function build(): GraphQLSchema\n    {\n        // Tipo User\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(function() use (&$postType) {\n                        return $postType;\n                    }),\n                    'resolve' => function($user) {\n                        return \\App\\Resolvers\\QueryResolver::getPostsByUser($user['id']);\n                    }\n                ]\n            ]\n        ]);\n\n        // Tipo Post\n        $postType = new ObjectType([\n            'name' => 'Post',\n            'fields' => [\n                'id' => Type::int(),\n                'title' => Type::string(),\n                'content' => Type::string(),\n                'author' => [\n                    'type' => $userType,\n                    'resolve' => function($post) {\n                        return \\App\\Resolvers\\QueryResolver::getUserById($post['author_id']);\n                    }\n                ]\n            ]\n        ]);\n\n        // Tipo raíz Query\n        $queryType = new ObjectType([\n            'name' => 'Query',\n            'fields' => [\n                'users' => [\n                    'type' => Type::listOf($userType),\n                    'resolve' => function() {\n                        return \\App\\Resolvers\\QueryResolver::getAllUsers();\n                    }\n                ],\n                'user' => [\n                    'type' => $userType,\n                    'args' => [\n                        'id' => Type::nonNull(Type::int())\n                    ]                

Blogs

Book Recommendations