Introdução ao GraphQL e PHP
GraphQL é uma linguagem de consulta para APIs e um ambiente de execução para executar essas consultas com dados existentes. Diferente do REST, onde você obtém uma estrutura de resposta fixa, o GraphQL permite que o cliente solicite apenas os dados que realmente precisa. Isso torna a API mais flexível e eficiente.
Neste tutorial, criaremos uma GraphQL API simples em PHP do zero. Você aprenderá como instalar as bibliotecas necessárias, definir o schema, escrever resolvers e processar consultas. O artigo é voltado para desenvolvedores iniciantes familiarizados com o básico de PHP e bancos de dados (por exemplo, MySQL ou SQLite).
Usaremos a biblioteca webonyx/graphql-php — o pacote mais popular e estável para implementar GraphQL em PHP. Ao final, você poderá executar seu próprio servidor GraphQL e fazer consultas a ele através de qualquer cliente HTTP (por exemplo, cURL ou Insomnia).
Instalação e configuração do projeto
Passo 1: Criando o projeto e instalando dependências
Para começar, crie um novo diretório para o projeto e inicialize o Composer:
mkdir graphql-php-tutorialcd graphql-php-tutorialcomposer initEm seguida, instale a biblioteca webonyx/graphql-php:
composer require webonyx/graphql-phpTambém precisaremos de um servidor HTTP compatível com PSR-7. Para simplificar, usaremos o servidor PHP embutido e a biblioteca guzzlehttp/psr7 para trabalhar com requisições e respostas:
composer require guzzlehttp/psr7Passo 2: Estrutura do projeto
Crie a seguinte estrutura de arquivos:
index.php— ponto de entrada da aplicaçãoschema.graphql— arquivo com a definição do schema GraphQLresolvers.php— arquivo com funções resolversdata.php— simulação de banco de dados (array com dados)
Definição do schema GraphQL
Passo 3: Escrevendo o schema
O schema é a descrição dos tipos de dados e operações disponíveis (consultas e mutações). Vamos criar um schema simples para gerenciar uma lista de livros. Abra o arquivo schema.graphql e insira o seguinte 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}Aqui definimos:
- Book — tipo de dados com campos id, title, author e year.
- Query — operações para obter dados: lista de todos os livros e livro por ID.
- Mutation — operações para modificar dados: adicionar e remover livro.
Passo 4: Preparando dados e resolvers
Crie o arquivo data.php com um array de livros:
<?php$books = [ 1 => ['id' => 1, 'title' => 'Guerra e Paz', 'author' => 'Liev Tolstói', 'year' => 1869], 2 => ['id' => 2, 'title' => 'Crime e Castigo', 'author' => 'Fiódor Dostoiévski', 'year' => 1866],];Agora escreva os resolvers no arquivo resolvers.php. Resolvers são funções que retornam dados para cada campo do schema.
<?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;