PHP

Guia Completo de GraphQL com PHP: Conceitos e Implementação Básica

8 min de leitura

Guia Completo de GraphQL com PHP: Conceitos e Implementação Básica

O que é GraphQL e por que usar com PHP GraphQL é uma linguagem de query para APIs que permite que clientes solicitem exatamente os dados que precisam, nada mais, nada menos. Diferente de REST, onde você recebe respostas pré-definidas, GraphQL oferece flexibilidade total. Com PHP, você pode implementar servidores GraphQL robustos usando bibliotecas como webonyx/graphql-php, a implementação oficial de referência. A principal vantagem é resolver o problema de over-fetching (receber dados desnecessários) e under-fetching (precisar fazer múltiplas requisições). Para uma aplicação PHP que serve múltiplos clientes (web, mobile, APIs internas), GraphQL reduz banda de rede, melhora performance e oferece uma experiência de desenvolvimento superior. Conceitos Fundamentais Schema, Tipos e Queries Um schema GraphQL define a estrutura de dados disponíveis. Você precisa definir tipos (Type), campos (Fields) e como os dados serão consultados (Queries). Pense no schema como um contrato entre cliente e servidor. Mutations Mutations são usadas para modificar dados no servidor. Se Queries são como GET em REST,

<h2>O que é GraphQL e por que usar com PHP</h2>

<p>GraphQL é uma linguagem de query para APIs que permite que clientes solicitem exatamente os dados que precisam, nada mais, nada menos. Diferente de REST, onde você recebe respostas pré-definidas, GraphQL oferece flexibilidade total. Com PHP, você pode implementar servidores GraphQL robustos usando bibliotecas como webonyx/graphql-php, a implementação oficial de referência.</p>

<p>A principal vantagem é resolver o problema de over-fetching (receber dados desnecessários) e under-fetching (precisar fazer múltiplas requisições). Para uma aplicação PHP que serve múltiplos clientes (web, mobile, APIs internas), GraphQL reduz banda de rede, melhora performance e oferece uma experiência de desenvolvimento superior.</p>

<h2>Conceitos Fundamentais</h2>

<h3>Schema, Tipos e Queries</h3>

<p>Um schema GraphQL define a estrutura de dados disponíveis. Você precisa definir tipos (Type), campos (Fields) e como os dados serão consultados (Queries). Pense no schema como um contrato entre cliente e servidor.</p>

<pre><code class="language-php">&lt;?php

use GraphQL\Type\Definition\ObjectType;

use GraphQL\Type\Definition\Type;

use GraphQL\Type\Schema;

$userType = new ObjectType([

&#039;name&#039; =&gt; &#039;User&#039;,

&#039;fields&#039; =&gt; [

&#039;id&#039; =&gt; Type::nonNull(Type::int()),

&#039;nome&#039; =&gt; Type::nonNull(Type::string()),

&#039;email&#039; =&gt; Type::string(),

&#039;idade&#039; =&gt; Type::int(),

],

]);

$queryType = new ObjectType([

&#039;name&#039; =&gt; &#039;Query&#039;,

&#039;fields&#039; =&gt; [

&#039;usuario&#039; =&gt; [

&#039;type&#039; =&gt; $userType,

&#039;args&#039; =&gt; [

&#039;id&#039; =&gt; Type::nonNull(Type::int()),

],

&#039;resolve&#039; =&gt; function($root, $args) {

// Simular busca no banco de dados

return [

&#039;id&#039; =&gt; $args[&#039;id&#039;],

&#039;nome&#039; =&gt; &#039;João Silva&#039;,

&#039;email&#039; =&gt; &#039;joao@example.com&#039;,

&#039;idade&#039; =&gt; 28,

];

},

],

],

]);

$schema = new Schema([&#039;query&#039; =&gt; $queryType]);</code></pre>

<h3>Mutations</h3>

<p>Mutations são usadas para modificar dados no servidor. Se Queries são como GET em REST, Mutations são como POST, PUT e DELETE. Elas permitem criar, atualizar ou deletar recursos.</p>

<pre><code class="language-php">$mutationType = new ObjectType([

&#039;name&#039; =&gt; &#039;Mutation&#039;,

&#039;fields&#039; =&gt; [

&#039;criarUsuario&#039; =&gt; [

&#039;type&#039; =&gt; $userType,

&#039;args&#039; =&gt; [

&#039;nome&#039; =&gt; Type::nonNull(Type::string()),

&#039;email&#039; =&gt; Type::nonNull(Type::string()),

&#039;idade&#039; =&gt; Type::int(),

],

&#039;resolve&#039; =&gt; function($root, $args) {

// Simular inserção no banco

return [

&#039;id&#039; =&gt; rand(1, 1000),

&#039;nome&#039; =&gt; $args[&#039;nome&#039;],

&#039;email&#039; =&gt; $args[&#039;email&#039;],

&#039;idade&#039; =&gt; $args[&#039;idade&#039;] ?? null,

];

},

],

],

]);

$schema = new Schema([

&#039;query&#039; =&gt; $queryType,

&#039;mutation&#039; =&gt; $mutationType,

]);</code></pre>

<h2>Implementação Prática com PHP</h2>

<h3>Instalação e Configuração Inicial</h3>

<p>Comece instalando a biblioteca via Composer: <code>composer require webonyx/graphql-php</code>. Essa é a implementação de referência mantida pelo criador do GraphQL. Depois crie um arquivo para receber as requisições GraphQL.</p>

<pre><code class="language-php">&lt;?php

require_once __DIR__ . &#039;/vendor/autoload.php&#039;;

use GraphQL\GraphQL;

use GraphQL\Error\DebugFlag;

$input = file_get_contents(&#039;php://input&#039;);

$data = json_decode($input, true);

$query = $data[&#039;query&#039;] ?? null;

$variables = $data[&#039;variables&#039;] ?? [];

try {

$result = GraphQL::executeQuery(

$schema,

$query,

null,

null,

$variables

);

$output = $result-&gt;toArray(DebugFlag::INCLUDE_DEBUG_MESSAGE);

} catch (\Exception $e) {

$output = [

&#039;errors&#039; =&gt; [[&#039;message&#039; =&gt; $e-&gt;getMessage()]]

];

}

header(&#039;Content-Type: application/json; charset=utf-8&#039;);

echo json_encode($output);</code></pre>

<h3>Exemplo Completo com Banco de Dados</h3>

<p>Aqui está uma implementação realista usando PDO para persistência:</p>

<pre><code class="language-php">&lt;?php

require_once &#039;vendor/autoload.php&#039;;

use GraphQL\Type\Definition\ObjectType;

use GraphQL\Type\Definition\Type;

use GraphQL\Type\Schema;

use GraphQL\GraphQL;

// Conexão com banco (PDO)

$pdo = new PDO(&#039;sqlite::memory:&#039;);

$pdo-&gt;exec(&#039;CREATE TABLE usuarios (id INTEGER PRIMARY KEY, nome TEXT, email TEXT)&#039;);

$pdo-&gt;exec(&#039;INSERT INTO usuarios (nome, email) VALUES (&quot;Ana&quot;, &quot;ana@test.com&quot;)&#039;);

$userType = new ObjectType([

&#039;name&#039; =&gt; &#039;User&#039;,

&#039;fields&#039; =&gt; function() {

return [

&#039;id&#039; =&gt; Type::nonNull(Type::int()),

&#039;nome&#039; =&gt; Type::string(),

&#039;email&#039; =&gt; Type::string(),

];

},

]);

$queryType = new ObjectType([

&#039;name&#039; =&gt; &#039;Query&#039;,

&#039;fields&#039; =&gt; [

&#039;usuarios&#039; =&gt; [

&#039;type&#039; =&gt; Type::listOf($userType),

&#039;resolve&#039; =&gt; function() use ($pdo) {

$stmt = $pdo-&gt;query(&#039;SELECT * FROM usuarios&#039;);

return $stmt-&gt;fetchAll(PDO::FETCH_ASSOC);

},

],

],

]);

$mutationType = new ObjectType([

&#039;name&#039; =&gt; &#039;Mutation&#039;,

&#039;fields&#039; =&gt; [

&#039;adicionarUsuario&#039; =&gt; [

&#039;type&#039; =&gt; $userType,

&#039;args&#039; =&gt; [

&#039;nome&#039; =&gt; Type::nonNull(Type::string()),

&#039;email&#039; =&gt; Type::nonNull(Type::string()),

],

&#039;resolve&#039; =&gt; function($root, $args) use ($pdo) {

$stmt = $pdo-&gt;prepare(&#039;INSERT INTO usuarios (nome, email) VALUES (?, ?)&#039;);

$stmt-&gt;execute([$args[&#039;nome&#039;], $args[&#039;email&#039;]]);

return [

&#039;id&#039; =&gt; $pdo-&gt;lastInsertId(),

&#039;nome&#039; =&gt; $args[&#039;nome&#039;],

&#039;email&#039; =&gt; $args[&#039;email&#039;],

];

},

],

],

]);

$schema = new Schema([&#039;query&#039; =&gt; $queryType, &#039;mutation&#039; =&gt; $mutationType]);

$input = json_decode(file_get_contents(&#039;php://input&#039;), true);

$result = GraphQL::executeQuery($schema, $input[&#039;query&#039;], null, null, $input[&#039;variables&#039;] ?? []);

header(&#039;Content-Type: application/json&#039;);

echo json_encode($result-&gt;toArray());</code></pre>

<p>Cliente fazendo requisições:</p>

<pre><code class="language-javascript">// Exemplo com fetch em JavaScript

fetch(&#039;/graphql&#039;, {

method: &#039;POST&#039;,

headers: { &#039;Content-Type&#039;: &#039;application/json&#039; },

body: JSON.stringify({

query: &#039;{ usuarios { id nome email } }&#039;

})

})

.then(r =&gt; r.json())

.then(data =&gt; console.log(data));</code></pre>

<h2>Boas Práticas e Dicas</h2>

<p>Organize seu código separando tipos, queries e mutations em arquivos diferentes para melhor manutenção. Use type hints PHP 7+ e validation para garantir dados corretos. Implemente autenticação e autorização verificando permissões dentro dos resolvers. Sempre valide inputs no servidor — nunca confie em dados do cliente. Use ferramentas como GraphQL Playground ou GraphiQL para testar suas queries de forma interativa.</p>

<blockquote><p><strong>Dica de performance</strong>: Use data loaders para evitar N+1 queries ao resolver listas com relacionamentos. A biblioteca <code>webonyx/graphql-php</code> oferece exemplos dessa prática.</p></blockquote>

<h2>Conclusão</h2>

<p>GraphQL com PHP oferece uma forma moderna e eficiente de construir APIs. Os três pontos principais que você deve levar consigo: (1) GraphQL soluciona problemas reais de REST através de queries flexíveis e precisas; (2) implementar em PHP é direto usando webonyx/graphql-php, com schemas que definem claramente sua API; (3) organize seu código, valide sempre no servidor e use boas práticas de segurança desde o início.</p>

<p>Continue explorando resolvers avançados, subscriptions para real-time e integração com frameworks como Laravel. A curva de aprendizado é suave se você entender os conceitos fundamentais.</p>

<h2>Referências</h2>

<ul>

<li><a href="https://graphql.org/" target="_blank" rel="noopener noreferrer">GraphQL Official Documentation</a></li>

<li><a href="https://github.com/webonyx/graphql-core-js" target="_blank" rel="noopener noreferrer">webonyx/graphql-php GitHub</a></li>

<li><a href="https://graphql.org/learn/best-practices/" target="_blank" rel="noopener noreferrer">GraphQL Best Practices</a></li>

<li><a href="https://www.howtographql.com/" target="_blank" rel="noopener noreferrer">How to GraphQL - Tutorial Completo</a></li>

<li><a href="https://www.php.net/manual/en/language.types.declarations.php" target="_blank" rel="noopener noreferrer">PHP.net Type Hints</a></li>

</ul>

Comentários

Mais em PHP

Upload de Arquivos com PHP: Validação e Segurança na Prática
Upload de Arquivos com PHP: Validação e Segurança na Prática

Upload de Arquivos com PHP: Validação e Segurança Upload de arquivos é uma fu...

Dominando Padrão MVC em PHP: Construindo do Zero sem Framework em Projetos Reais
Dominando Padrão MVC em PHP: Construindo do Zero sem Framework em Projetos Reais

O que é o Padrão MVC e Por Que Aprender Sem Framework MVC (Model-View-Control...

Como Usar Exceptions e Tratamento de Erros em PHP em Produção
Como Usar Exceptions e Tratamento de Erros em PHP em Produção

Entendendo Exceptions em PHP Uma exception (exceção) é um objeto que represen...