{"id":5599,"date":"2018-08-16T07:00:59","date_gmt":"2018-08-16T14:00:59","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=5599"},"modified":"2025-06-13T21:28:53","modified_gmt":"2025-06-14T04:28:53","slug":"create-graphql-api-php-nosql","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/create-graphql-api-php-nosql\/","title":{"rendered":"Crie uma API acionada por GraphQL com PHP e NoSQL"},"content":{"rendered":"<p>Se voc\u00ea estiver acompanhando, saber\u00e1 que estou escrevendo uma esp\u00e9cie de megass\u00e9rie sobre desenvolvimento com <a href=\"https:\/\/graphql.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">GraphQL<\/a> e Couchbase. Nos tutoriais anteriores, exploramos <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/processing-graphql-queries-with-java-spring-boot-and-nosql\/\" target=\"_blank\" rel=\"noopener noreferrer\">Como usar o GraphQL com Java<\/a>, <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/creating-a-graphql-application-with-node-js-and-a-nosql-database\/\" target=\"_blank\" rel=\"noopener noreferrer\">Como usar o GraphQL com o Node.js<\/a>e <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/using-graphql-with-golang-and-a-nosql-database\/\" target=\"_blank\" rel=\"noopener noreferrer\">Como usar o GraphQL com a Golang<\/a>.<\/p>\n<p>Depois de produzir conte\u00fado em todas essas linguagens, algu\u00e9m da minha equipe me perguntou onde estava o PHP na mistura. A partir desse coment\u00e1rio, surgiu este tutorial sobre a cria\u00e7\u00e3o de uma API com GraphQL e PHP usando <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/\" target=\"_blank\" rel=\"noopener noreferrer\">Couchbase<\/a> NoSQL como o <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/resources\/concepts\/data-platforms\/\">camada de dados<\/a>.<\/p>\n<p><!--more--><\/p>\n<p>Antes de se dedicar muito a este tutorial de PHP e NoSQL GraphQL, h\u00e1 algumas premissas que devem ser atendidas:<\/p>\n<ol>\n<li>O Couchbase j\u00e1 deve ter sido instalado e configurado.<\/li>\n<li>O PHP deve ter sido instalado e configurado.<\/li>\n<li>O Composer e o PECL devem estar dispon\u00edveis para o download das depend\u00eancias do projeto PHP.<\/li>\n<\/ol>\n<p>Supondo que as condi\u00e7\u00f5es acima sejam atendidas, podemos prosseguir com o desenvolvimento do nosso aplicativo.<\/p>\n<h2>Cria\u00e7\u00e3o de um novo projeto com depend\u00eancias do GraphQL e do Couchbase para PHP<\/h2>\n<p>A primeira etapa para o sucesso do nosso projeto \u00e9 criar um e fazer o download das depend\u00eancias necess\u00e1rias. Em algum lugar de seu computador, crie um novo diret\u00f3rio e inclua um arquivo\u00a0<strong>graphql.php<\/strong> arquivo. Usando o prompt de comando dentro desse diret\u00f3rio, execute o seguinte:<\/p>\n<pre class=\"lang:default decode:true\">composer require webonyx\/graphql-php<\/pre>\n<p>O comando acima instalar\u00e1 a depend\u00eancia GraphQL que faz todo o trabalho pesado da nossa API. Em seguida, execute o seguinte comando em seu prompt de comando:<\/p>\n<pre class=\"lang:default decode:true\">pecl install couchbase<\/pre>\n<p>O comando acima instalar\u00e1 o Couchbase PHP SDK. Reiterando minhas suposi\u00e7\u00f5es anteriores, voc\u00ea precisa ter <a href=\"https:\/\/getcomposer.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">Compositor<\/a> e <a href=\"https:\/\/pecl.php.net\/\" target=\"_blank\" rel=\"noopener noreferrer\">PECL<\/a> dispon\u00edveis para voc\u00ea.<\/p>\n<p>Mais informa\u00e7\u00f5es sobre o <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/sdk\/php\/start-using-sdk.html\" target=\"_blank\" rel=\"noopener noreferrer\">SDK PHP do Couchbase<\/a> e o <a href=\"https:\/\/webonyx.github.io\/graphql-php\/getting-started\/\" target=\"_blank\" rel=\"noopener noreferrer\">Pacote GraphQL<\/a> podem ser encontradas em cada uma de suas respectivas documenta\u00e7\u00f5es.<\/p>\n<h2>Configura\u00e7\u00e3o do projeto para o desenvolvimento do GraphQL e do Couchbase<\/h2>\n<p>Com o projeto criado e o download das depend\u00eancias, podemos trabalhar para inicializar nosso aplicativo. Abra o diret\u00f3rio\u00a0<strong>graphql.php<\/strong> e inclua o seguinte:<\/p>\n<pre class=\"lang:default decode:true\">username('example')-&gt;password('123456');\r\n$cluster-&gt;authenticate($authenticator);\r\n$bucket = $cluster-&gt;openBucket('example');\r\n\r\nheader('Content-Type: application\/json');\r\n\r\n?&gt;<\/pre>\n<p>No c\u00f3digo acima, estamos fazendo refer\u00eancia \u00e0 nossa depend\u00eancia do Composer e incluindo algumas das classes GraphQL que planejamos usar. Sem realmente configurar o GraphQL ou usar o nosso banco de dados, precisamos estabelecer uma conex\u00e3o com o nosso banco de dados.<\/p>\n<p>Meu aplicativo PHP estava sendo executado localmente junto com minha inst\u00e2ncia do Couchbase. Certifique-se de preencher as lacunas quando se tratar de suas pr\u00f3prias informa\u00e7\u00f5es de conex\u00e3o com o Couchbase.<\/p>\n<h2>Defini\u00e7\u00e3o de objetos GraphQL para gerenciamento de dados<\/h2>\n<p>Agora podemos nos concentrar em definir nosso modelo de dados, tamb\u00e9m conhecido como objetos GraphQL em nossa API. Neste exemplo espec\u00edfico, faremos refer\u00eancia a dados de Pok\u00e9mon. Por esse motivo, podemos ter informa\u00e7\u00f5es sobre um Pokemon espec\u00edfico, quais movimentos ele tem ou em qual videogame ele \u00e9 encontrado. Essa ser\u00e1 a base do nosso modelo de dados.<\/p>\n<p>Vamos come\u00e7ar com o seguinte em nosso\u00a0<strong>graphql.php<\/strong> usando este exemplo:<\/p>\n<pre class=\"lang:default decode:true\">$moveType = new ObjectType([\r\n    'name' =&gt; 'Move',\r\n    'fields' =&gt; [\r\n        'name' =&gt; [ 'type' =&gt; Type::string() ],\r\n        'type' =&gt; [ [ 'type' =&gt; Type::string() ],\r\n        'power' =&gt; [ [ 'type' =&gt; Type::int() ],\r\n    ],\r\n]);\r\n\r\n$pokemonType = new ObjectType([\r\n    'name' =&gt; 'Pokemon',\r\n    'fields' =&gt; [\r\n        'name' =&gt; [ 'type' =&gt; Type::string() ],\r\n        'weight' =&gt; [ [ 'type' =&gt; Type::int() ],\r\n        'height' =&gt; [ 'type' =&gt; Type::int() ],\r\n        'attributes' =&gt; [ 'type' =&gt; Type::listOf(Type::string()) ],\r\n        'moves' =&gt; [ 'type' =&gt; Type::listOf($moveType) ],\r\n    ],\r\n]);<\/pre>\n<p>No c\u00f3digo acima, temos dois objetos com as poss\u00edveis propriedades JSON, tamb\u00e9m chamadas de campos. Para o objeto <code>$pokemonType<\/code> temos um campo que faz refer\u00eancia ao nosso outro objeto. O <code>listOf<\/code> significa que podemos esperar o retorno de uma matriz de dados.<\/p>\n<p>Os dois objetos que temos est\u00e3o longe de ser t\u00e3o complexos quanto poderiam ser, mas servem como um exemplo realista. No entanto, at\u00e9 o momento, eles n\u00e3o s\u00e3o nada mais do que um modelo. Precisamos ser capazes de preench\u00ea-los com dados reais do nosso banco de dados.<\/p>\n<h2>Desenvolvimento de consultas para preencher objetos GraphQL<\/h2>\n<p>A pr\u00f3xima etapa \u00e9 criar consultas a serem executadas em nosso banco de dados que preencher\u00e3o nossos objetos GraphQL. Isso \u00e9 feito por meio de consultas, que, no fim das contas, nada mais s\u00e3o do que outro objeto GraphQL que cont\u00e9m l\u00f3gica.<\/p>\n<p>Veja o c\u00f3digo a seguir, por exemplo:<\/p>\n<pre class=\"lang:default decode:true\">$queryType = new ObjectType([\r\n    'name' =&gt; 'Query',\r\n    'fields' =&gt; [\r\n        'pokemons' =&gt; [\r\n            'type' =&gt; Type::listOf($pokemonType),\r\n            'resolve' =&gt; function ($root, $args) {\r\n                global $bucket;\r\n                $query = CouchbaseN1qlQuery::fromString(\"SELECT example.* FROM example WHERE type = 'pokemon'\");\r\n                $result = $bucket-&gt;query($query);\r\n                return $result-&gt;rows;\r\n            }\r\n        ],\r\n        'pokemon' =&gt; [\r\n            'type' =&gt; $pokemonType,\r\n            'args' =&gt; [\r\n                'id' =&gt; Type::nonNull(Type::string()),\r\n            ],\r\n            'resolve' =&gt; function ($root, $args) {\r\n                global $bucket;\r\n                $result = $bucket-&gt;get(\"pokemon-\" . $args['id']);\r\n                return $result-&gt;value;\r\n            }\r\n        ],\r\n    ],\r\n]);<\/pre>\n<p>O c\u00f3digo acima, que acabaria em seu\u00a0<strong>graphql.php<\/strong> tem duas consultas poss\u00edveis. A primeira consulta chamada <code>pokemons<\/code> retornar\u00e1 uma matriz do <code>$pokemonType<\/code> modelo. O <code>resolver<\/code> \u00e9 o que de fato executa a l\u00f3gica. A l\u00f3gica para <code>pokemons<\/code> executar\u00e1 uma consulta N1QL do Couchbase e retornar\u00e1 o resultado. O resultado da consulta N1QL \u00e9 mapeado para cada um dos campos definidos em nosso objeto GraphQL.<\/p>\n<p>Executando o <code>pokemons<\/code> A consulta pode ser mais ou menos assim:<\/p>\n<pre class=\"lang:default decode:true\">curl https:\/\/localhost:8080 -d '{\"query\": \"query { pokemons{ name, height, attributes } }\" }'<\/pre>\n<p>O <code>pokemon<\/code> A consulta \u00e9 semelhante, mas n\u00e3o \u00e9 a mesma. No <code>pokemon<\/code> estamos exigindo uma consulta <code>id<\/code> ser aprovado. Esse <code>id<\/code> \u00e9 usado para fazer uma pesquisa direta de um determinado documento NoSQL em vez de uma consulta NoSQL.<\/p>\n<p>O <code>pokemon<\/code> A consulta pode ser mais ou menos assim:<\/p>\n<pre class=\"lang:default decode:true\">curl https:\/\/localhost:8080 -d '{\"query\": \"query { pokemon(id: \\\"25\\\"){ name, height, attributes } }\" }'<\/pre>\n<p>O resultado dessa consulta ser\u00e1 um \u00fanico objeto em vez de uma matriz.<\/p>\n<h2>Manuseio de relacionamentos de modelo de forma simplista<\/h2>\n<p>Agora, digamos que quis\u00e9ssemos algum tipo de relacionamento de dados. At\u00e9 agora, presumimos que os dados de movimento e os dados de Pok\u00e9mon existem no mesmo documento, mas e se tiv\u00e9ssemos dados divididos, mas relacionados?<\/p>\n<p>H\u00e1 duas abordagens para isso:<\/p>\n<ol>\n<li>Podemos fazer uma consulta JOIN, o que torna o gerenciamento de consultas potencialmente mais complexo.<\/li>\n<li>Podemos modularizar as consultas com base em cada campo, mantendo-as pequenas e eficientes.<\/li>\n<\/ol>\n<p>Se voc\u00ea teve a oportunidade de ouvir meu podcast intitulado <a href=\"https:\/\/www.thepolyglotdeveloper.com\/2018\/08\/tpdp-e20-graphql-api-development\/\" target=\"_blank\" rel=\"noopener noreferrer\">GraphQL para desenvolvimento de API<\/a> que contou com a participa\u00e7\u00e3o do cocriador do GraphQL, Lee Byron, voc\u00ea saber\u00e1 que nenhum dos dois est\u00e1 errado e que tudo se resume \u00e0 prefer\u00eancia. Vamos dar uma olhada na \u00faltima op\u00e7\u00e3o, em que modularizamos as consultas e os objetos GraphQL.<\/p>\n<p>Digamos que agora queiramos incluir os dados do jogo e que eles sejam um objeto separado como este:<\/p>\n<pre class=\"lang:default decode:true\">$gameType = new ObjectType([\r\n    'name' =&gt; 'Game',\r\n    'fields' =&gt; [\r\n        'name' =&gt; [ 'type' =&gt; Type::string() ],\r\n    ],\r\n]);<\/pre>\n<p>Agora, digamos que os documentos do Pok\u00e9mon em nosso banco de dados contenham um ID do jogo, mas n\u00e3o os dados reais. Semelhante a um relacionamento de chave prim\u00e1ria e estrangeira, mas n\u00e3o de fato, pois se trata de NoSQL.<\/p>\n<p>O que poder\u00edamos fazer agora \u00e9 o seguinte:<\/p>\n<pre class=\"lang:default decode:true\">$pokemonType = new ObjectType([\r\n    'name' =&gt; 'Pokemon',\r\n    'fields' =&gt; [\r\n        'name' =&gt; [ 'type' =&gt; Type::string() ],\r\n        'weight' =&gt; [ [ 'type' =&gt; Type::int() ],\r\n        'height' =&gt; [ 'type' =&gt; Type::int() ],\r\n        'attributes' =&gt; [ 'type' =&gt; Type::listOf(Type::string()) ],\r\n        'moves' =&gt; [ 'type' =&gt; Type::listOf($moveType) ],\r\n        'game' =&gt; [\r\n            'type' =&gt; $gameType,\r\n            'resolve' =&gt; function ($root, $args) {\r\n                global $bucket;\r\n                $result = $bucket-&gt;get($root-&gt;game);\r\n                return $result-&gt;value;\r\n            }\r\n        ],\r\n    ],\r\n]);<\/pre>\n<p>Observe que alteramos nosso <code>$pokemonType<\/code> para incluir um campo de jogo, mas esse campo tem seu pr\u00f3prio <code>resolver<\/code> fun\u00e7\u00e3o. Dentro dessa <code>resolver<\/code> podemos acessar a fun\u00e7\u00e3o pai ou <code>$root<\/code> que cont\u00e9m um ID do jogo, porque \u00e9 isso que nosso <code>pokemon<\/code> e <code>pokemons<\/code> que as consultas nos forneceram. Usando o id, podemos obter os dados do jogo que existem em um documento separado e retorn\u00e1-los.<\/p>\n<p>Agora, nosso <code>pokemons<\/code> \u00e9 poupada de uma instru\u00e7\u00e3o JOIN. N\u00e3o estou dizendo que uma instru\u00e7\u00e3o JOIN seja ruim, mas imagine se voc\u00ea tivesse alguns modelos de dados malucos que exigissem uma consulta de 50 linhas. Nesses casos, pode fazer sentido dividi-los em vez de tentar manter uma consulta enorme. Um fato interessante \u00e9 que a opera\u00e7\u00e3o do jogo no banco de dados n\u00e3o ser\u00e1 chamada a menos que o campo do jogo seja solicitado em uma instru\u00e7\u00e3o <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/processing-graphql-queries-with-java-spring-boot-and-nosql\/\">Consulta GraphQL<\/a> do front-end.<\/p>\n<h2>Reunindo o aplicativo<\/h2>\n<p>\u00c9 hora de reunir o aplicativo. At\u00e9 o momento, vimos apenas os modelos de dados e as consultas, mas n\u00e3o o configuramos para uso com o GraphQL.<\/p>\n<p>D\u00ea uma olhada no c\u00f3digo agora completo:<\/p>\n<pre class=\"lang:default decode:true\">username('example')-&gt;password('123456');\r\n$cluster-&gt;authenticate($authenticator);\r\n$bucket = $cluster-&gt;openBucket('example');\r\n\r\n$gameType = new ObjectType([\r\n    'name' =&gt; 'Game',\r\n    'fields' =&gt; [\r\n        'name' =&gt; [ 'type' =&gt; Type::string() ],\r\n    ],\r\n]);\r\n\r\n$moveType = new ObjectType([\r\n    'name' =&gt; 'Move',\r\n    'fields' =&gt; [\r\n        'name' =&gt; [ 'type' =&gt; Type::string() ],\r\n        'type' =&gt; [ [ 'type' =&gt; Type::string() ],\r\n        'power' =&gt; [ [ 'type' =&gt; Type::int() ],\r\n    ],\r\n]);\r\n\r\n$pokemonType = new ObjectType([\r\n    'name' =&gt; 'Pokemon',\r\n    'fields' =&gt; [\r\n        'name' =&gt; [ 'type' =&gt; Type::string() ],\r\n        'weight' =&gt; [ [ 'type' =&gt; Type::int() ],\r\n        'height' =&gt; [ 'type' =&gt; Type::int() ],\r\n        'attributes' =&gt; [ 'type' =&gt; Type::listOf(Type::string()) ],\r\n        'moves' =&gt; [ 'type' =&gt; Type::listOf($moveType) ],\r\n        'game' =&gt; [\r\n            'type' =&gt; $gameType,\r\n            'resolve' =&gt; function ($root, $args) {\r\n                global $bucket;\r\n                $result = $bucket-&gt;get($root-&gt;game);\r\n                return $result-&gt;value;\r\n            }\r\n        ],\r\n    ],\r\n]);\r\n\r\n$queryType = new ObjectType([\r\n    'name' =&gt; 'Query',\r\n    'fields' =&gt; [\r\n        'pokemons' =&gt; [\r\n            'type' =&gt; Type::listOf($pokemonType),\r\n            'resolve' =&gt; function ($root, $args) {\r\n                global $bucket;\r\n                $query = CouchbaseN1qlQuery::fromString(\"SELECT example.* FROM example WHERE type = 'pokemon'\");\r\n                $result = $bucket-&gt;query($query);\r\n                return $result-&gt;rows;\r\n            }\r\n        ],\r\n        'pokemon' =&gt; [\r\n            'type' =&gt; $pokemonType,\r\n            'args' =&gt; [\r\n                'id' =&gt; Type::nonNull(Type::string()),\r\n            ],\r\n            'resolve' =&gt; function ($root, $args) {\r\n                global $bucket;\r\n                $result = $bucket-&gt;get(\"pokemon-\" . $args['id']);\r\n                return $result-&gt;value;\r\n            }\r\n        ],\r\n    ],\r\n]);\r\n\r\n$schema = new Schema([\r\n    'query' =&gt; $queryType\r\n]);\r\n\r\n$rawInput = file_get_contents('php:\/\/input');\r\n$input = json_decode($rawInput, true);\r\n$query = $input['query'];\r\n$variableValues = isset($input['variables']) ? $input['variables'] : null;\r\n\r\ntry {\r\n    $result = GraphQL::executeQuery($schema, $query, null, null, $variableValues);\r\n    $output = $result-&gt;toArray();\r\n} catch (\\Exception $e) {\r\n    $output = [\r\n        'errors' =&gt; [\r\n            [\r\n                'message' =&gt; $e-&gt;getMessage()\r\n            ]\r\n        ]\r\n    ];\r\n}\r\n\r\nheader('Content-Type: application\/json');\r\necho json_encode($output);\r\n\r\n?&gt;<\/pre>\n<p>A metade inferior do c\u00f3digo foi extra\u00edda do c\u00f3digo <a href=\"https:\/\/webonyx.github.io\/graphql-php\/getting-started\/\" target=\"_blank\" rel=\"noopener noreferrer\">Documenta\u00e7\u00e3o oficial do servidor PHP GraphQL<\/a>. Essencialmente, estamos definindo nossas consultas como o esquema e recebendo qualquer entrada do usu\u00e1rio final. Essa entrada \u00e9 usada em combina\u00e7\u00e3o com o esquema para produzir um resultado que \u00e9 retornado ao usu\u00e1rio.<\/p>\n<h2>Conclus\u00e3o<\/h2>\n<p>Voc\u00ea acabou de ver como criar uma API GraphQL com PHP e <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/\" target=\"_blank\" rel=\"noopener noreferrer\">Couchbase<\/a> como o banco de dados NoSQL. O GraphQL \u00e9 uma \u00f3tima alternativa para a cria\u00e7\u00e3o de APIs RESTful porque permite que voc\u00ea mantenha adequadamente um modelo de dados que pode ser consultado por meio de um frontend. Isso reduz a quantidade de solicita\u00e7\u00f5es HTTP, bem como a carga \u00fatil retornada em qualquer solicita\u00e7\u00e3o.<\/p>\n<p>Se voc\u00ea quiser saber mais sobre como usar o Couchbase com PHP, confira um tutorial anterior que escrevi intitulado,\u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/pt\/getting-started-nosql-using-couchbase-server-php\/\" target=\"_blank\" rel=\"noopener noreferrer\">Primeiros passos com NoSQL usando o Couchbase Server e PHP<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>Se voc\u00ea estiver acompanhando, saber\u00e1 que estou escrevendo uma esp\u00e9cie de megass\u00e9rie sobre desenvolvimento com GraphQL e Couchbase. Nos tutoriais anteriores, exploramos como usar o GraphQL com Java, como usar o GraphQL com Node.js e como [...]<\/p>","protected":false},"author":63,"featured_media":5600,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1814,1815,9408],"tags":[1393,2210,1725,1745],"ppma_author":[9032],"class_list":["post-5599","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-application-design","category-best-practices-and-tutorials","category-php","tag-api","tag-graphql","tag-nosql-database","tag-restful"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.8 (Yoast SEO v25.8) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>GraphQL-Powered API with PHP and NoSQL: Tutorial + Examples<\/title>\n<meta name=\"description\" content=\"Need to create a new project with GraphQL and Couchbase Dependencies for PHP. Use an API with GraphQL and PHP using Couchbase NoSQL as the data layer.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/create-graphql-api-php-nosql\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Create a GraphQL-Powered API with PHP and NoSQL\" \/>\n<meta property=\"og:description\" content=\"Need to create a new project with GraphQL and Couchbase Dependencies for PHP. Use an API with GraphQL and PHP using Couchbase NoSQL as the data layer.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/create-graphql-api-php-nosql\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/thepolyglotdeveloper\" \/>\n<meta property=\"article:published_time\" content=\"2018-08-16T14:00:59+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T04:28:53+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/background-3045402_1920.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1080\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@nraboy\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/\"},\"author\":{\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1\"},\"headline\":\"Create a GraphQL-Powered API with PHP and NoSQL\",\"datePublished\":\"2018-08-16T14:00:59+00:00\",\"dateModified\":\"2025-06-14T04:28:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/\"},\"wordCount\":1263,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/background-3045402_1920.png\",\"keywords\":[\"API\",\"graphql\",\"NoSQL Database\",\"restful\"],\"articleSection\":[\"Application Design\",\"Best Practices and Tutorials\",\"PHP\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/\",\"name\":\"GraphQL-Powered API with PHP and NoSQL: Tutorial + Examples\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/background-3045402_1920.png\",\"datePublished\":\"2018-08-16T14:00:59+00:00\",\"dateModified\":\"2025-06-14T04:28:53+00:00\",\"description\":\"Need to create a new project with GraphQL and Couchbase Dependencies for PHP. Use an API with GraphQL and PHP using Couchbase NoSQL as the data layer.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/background-3045402_1920.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/background-3045402_1920.png\",\"width\":1920,\"height\":1080},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Create a GraphQL-Powered API with PHP and NoSQL\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1\",\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8863514d8bed0cf6080f23db40e00354\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"caption\":\"Nic Raboy, Developer Advocate, Couchbase\"},\"description\":\"Nic Raboy is an advocate of modern web and mobile development technologies. He has experience in Java, JavaScript, Golang and a variety of frameworks such as Angular, NativeScript, and Apache Cordova. Nic writes about his development experiences related to making web and mobile development easier to understand.\",\"sameAs\":[\"https:\/\/www.thepolyglotdeveloper.com\",\"https:\/\/www.facebook.com\/thepolyglotdeveloper\",\"https:\/\/x.com\/nraboy\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/nic-raboy-2\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"API alimentada por GraphQL com PHP e NoSQL: Tutorial + exemplos","description":"Preciso criar um novo projeto com depend\u00eancias GraphQL e Couchbase para PHP. Usar uma API com GraphQL e PHP usando o Couchbase NoSQL como camada de dados.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/pt\/create-graphql-api-php-nosql\/","og_locale":"pt_BR","og_type":"article","og_title":"Create a GraphQL-Powered API with PHP and NoSQL","og_description":"Need to create a new project with GraphQL and Couchbase Dependencies for PHP. Use an API with GraphQL and PHP using Couchbase NoSQL as the data layer.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/create-graphql-api-php-nosql\/","og_site_name":"The Couchbase Blog","article_author":"https:\/\/www.facebook.com\/thepolyglotdeveloper","article_published_time":"2018-08-16T14:00:59+00:00","article_modified_time":"2025-06-14T04:28:53+00:00","og_image":[{"width":1920,"height":1080,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/background-3045402_1920.png","type":"image\/png"}],"author":"Nic Raboy, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@nraboy","twitter_misc":{"Written by":"Nic Raboy, Developer Advocate, Couchbase","Est. reading time":"6 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/"},"author":{"name":"Nic Raboy, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1"},"headline":"Create a GraphQL-Powered API with PHP and NoSQL","datePublished":"2018-08-16T14:00:59+00:00","dateModified":"2025-06-14T04:28:53+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/"},"wordCount":1263,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/background-3045402_1920.png","keywords":["API","graphql","NoSQL Database","restful"],"articleSection":["Application Design","Best Practices and Tutorials","PHP"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/","url":"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/","name":"API alimentada por GraphQL com PHP e NoSQL: Tutorial + exemplos","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/background-3045402_1920.png","datePublished":"2018-08-16T14:00:59+00:00","dateModified":"2025-06-14T04:28:53+00:00","description":"Preciso criar um novo projeto com depend\u00eancias GraphQL e Couchbase para PHP. Usar uma API com GraphQL e PHP usando o Couchbase NoSQL como camada de dados.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/background-3045402_1920.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/background-3045402_1920.png","width":1920,"height":1080},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/create-graphql-api-php-nosql\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Create a GraphQL-Powered API with PHP and NoSQL"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1","name":"Nic Raboy, defensor dos desenvolvedores, Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8863514d8bed0cf6080f23db40e00354","url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","caption":"Nic Raboy, Developer Advocate, Couchbase"},"description":"Nic Raboy \u00e9 um defensor das modernas tecnologias de desenvolvimento m\u00f3vel e da Web. Ele tem experi\u00eancia em Java, JavaScript, Golang e uma variedade de estruturas, como Angular, NativeScript e Apache Cordova. Nic escreve sobre suas experi\u00eancias de desenvolvimento relacionadas a tornar o desenvolvimento m\u00f3vel e da Web mais f\u00e1cil de entender.","sameAs":["https:\/\/www.thepolyglotdeveloper.com","https:\/\/www.facebook.com\/thepolyglotdeveloper","https:\/\/x.com\/nraboy"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/nic-raboy-2\/"}]}},"authors":[{"term_id":9032,"user_id":63,"is_guest":0,"slug":"nic-raboy-2","display_name":"Nic Raboy, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","author_category":"","last_name":"Raboy","first_name":"Nic","job_title":"","user_url":"https:\/\/www.thepolyglotdeveloper.com","description":"Nic Raboy \u00e9 um defensor das modernas tecnologias de desenvolvimento m\u00f3vel e da Web. Ele tem experi\u00eancia em Java, JavaScript, Golang e uma variedade de estruturas, como Angular, NativeScript e Apache Cordova. Nic escreve sobre suas experi\u00eancias de desenvolvimento relacionadas a tornar o desenvolvimento m\u00f3vel e da Web mais f\u00e1cil de entender."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/5599","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/63"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=5599"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/5599\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/5600"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=5599"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=5599"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=5599"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=5599"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}