Introdução: Por que GraphQL e PHP são uma excelente combinação
No mundo do desenvolvimento web, a REST API foi por muito tempo o padrão de facto. No entanto, com o aumento da complexidade das aplicações e o surgimento de clientes móveis, as desvantagens do REST tornaram-se óbvias: excesso ou falta de dados, múltiplos endpoints, versionamento complexo. O GraphQL, desenvolvido pelo Facebook, resolve esses problemas permitindo que o cliente solicite apenas os dados de que precisa e os receba em uma única requisição.
O PHP, apesar de sua "velha escola", continua sendo uma linguagem poderosa para criar lógica de servidor. Graças a bibliotecas modernas, como webonyx/graphql-php, implementar uma API GraphQL em PHP tornou-se simples e eficiente. Neste tutorial, criaremos passo a passo um servidor GraphQL completo, capaz de processar queries, mutations e trabalhar com banco de dados.
Usaremos PHP 8.0+, Composer para gerenciamento de dependências e o servidor embutido do PHP para testes locais. Ao final do artigo, você poderá implantar sua própria API e integrá-la com qualquer frontend.
1. Instalação e configuração do ambiente
Antes de escrever código, é necessário preparar o projeto. Certifique-se de ter PHP 8.0+ e Composer instalados. Crie uma nova pasta para o projeto e acesse-a:
mkdir graphql-php-tutorialcd graphql-php-tutorialAgora instale a biblioteca principal webonyx/graphql-php usando o Composer:
composer require webonyx/graphql-phpPara trabalhar com o banco de dados, usaremos o PDO, que já vem embutido no PHP. Instale também uma biblioteca para facilitar o parsing de queries:
composer require graphql-php/graphql-phpCrie o arquivo index.php — este será o ponto de entrada da nossa aplicação. Configure o autoload do Composer e a estrutura básica:
<?phprequire_once __DIR__ . '/vendor/autoload.php';
use GraphQL\\GraphQL;use GraphQL\\Type\\Schema;use GraphQL\\Type\\Definition\\ObjectType;use GraphQL\\Type\\Definition\\Type;
// Aqui ficará nossa lógicaAlém disso, crie o arquivo schema.graphql para armazenar o schema em formato textual (opcional, mas útil para projetos grandes).
2. Definição do schema e tipos de dados
O coração de qualquer API GraphQL é o schema. Ele descreve quais dados estão disponíveis e como acessá-los. Em nosso exemplo, criaremos um modelo simples de usuário (User) e post (Post).
Comece definindo os tipos. No arquivo index.php, adicione as seguintes classes:
// Tipo User$userType = new ObjectType([ 'name' => 'User', 'fields' => [ 'id' => Type::int(), 'name' => Type::string(), 'email' => Type::string(), 'posts' => [ 'type' => Type::listOf($postType), 'resolve' => function ($user) use ($db) { // Função resolver para carregar os posts do usuário $stmt = $db->prepare('SELECT * FROM posts WHERE user_id = :id'); $stmt->execute([':id' => $user['id']]); return $stmt->fetchAll(PDO::FETCH_ASSOC); } ] ]]);
// Tipo Post$postType = new ObjectType([ 'name' => 'Post', 'fields' => [ 'id' => Type::int(), 'title' => Type::string(), 'content' => Type::string(), 'author' => [ 'type' => $userType, 'resolve' => function ($post) use ($db) { $stmt = $db->prepare('SELECT * FROM users WHERE id = :id'); $stmt->execute([':id' => $post['user_id']]); return $stmt->fetch(PDO::FETCH_ASSOC); } ] ]]);Observe os resolvers — são funções que determinam como obter os dados para cada campo. No exemplo acima, usamos PDO para consultas ao banco de dados.
Agora, crie