Biblioteca GraphQL PHP: webonyx/graphql-php
No desenvolvimento web moderno, a necessidade de APIs flexíveis e eficientes é cada vez maior. Os serviços REST tradicionais frequentemente sofrem com carregamento excessivo ou insuficiente de dados. GraphQL é uma linguagem de consulta e ambiente de execução criada pelo Facebook, que permite aos clientes solicitar exatamente os dados de que precisam. Para PHP, uma das implementações mais populares é a biblioteca webonyx/graphql-php.
Esta biblioteca fornece um conjunto completo de ferramentas para construir servidores GraphQL em PHP: desde a definição do esquema de tipos até o processamento de consultas complexas com relacionamentos aninhados. Ela é ideal para criar APIs modernas para aplicações web, aplicativos móveis e SPAs (Single Page Applications).
Principais recursos do webonyx/graphql-php
- Suporte completo à especificação GraphQL (junho de 2018) — todos os tipos, diretivas, variáveis e fragmentos.
- Sistema de tipos baseado em objetos PHP — definição de tipos, interfaces, tipos union e enum.
- Resolvedores integrados — possibilidade de definir a lógica de obtenção de dados para cada campo.
- Validação de consultas — verificação automática de sintaxe e tipos.
- Suporte a carregamento preguiçoso — dados são carregados apenas quando solicitados.
- Compatibilidade com frameworks populares — Laravel, Symfony, Yii2 através de pacotes wrapper.
Instalação e configuração
A instalação é feita via Composer:
composer require webonyx/graphql-phpPara funcionar, é necessário PHP 7.1+ com a extensão mbstring. Após a instalação, criaremos um servidor simples.
Exemplo: criando um esquema GraphQL
Vamos considerar um exemplo básico — obter uma lista de livros e autores. Primeiro, definimos os 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), // será definido abaixo 'resolve' => function ($author) { // Suponha que exista uma função getBooksByAuthorId() return getBooksByAuthorId($author['id']); } ] ]]);
// Tipo "Book" (definido com closure para referências 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']); } ] ]]);
// Criando o esquema$schema = new Schema([ 'query' => $queryType]);Processamento da consulta
Agora, escrevemos o código que recebe a consulta GraphQL e retorna o resultado:
<?phpuse GraphQL\\GraphQL;use GraphQL\\Error\\DebugFlag;
// Obtém o corpo da requisição da en