SlideShare a Scribd company logo
1 of 74
Download to read offline
Do REST ao GraphQL
com PHP
Bruno Neves
@brunodasneves
brunonm@gmail.com
Roteiro
★ REST & GraphQL
★ História
★ Especificação / Linguagem
★ PHP
App Newsfeed
GET /news/1
{
"id": "1",
"user_id": "57",
"media_id": "20",
"title": "Joesley rompe com Tony Ramos",
"excerpt": "Mussum, Ipsum, cacilds",
"text": "Mussum, Ipsum, cacilds vidis litro abertis...",
"created_at": "1495928417",
"status": "PUBLISHED"
}
GET /users/57
{
"id": "57",
"name": "Mad Max",
"email": "madmax@darkmira.com",
"role": "WRITER",
"created_at": "1495928417"
}
GET /medias/20
{
"id": "20",
"type": "image/jpeg",
"filename": "friboi.jpg",
"size": "204800",
"url": "http://news/media/65815736d29cc094a2d784c338066029"
}
GET /news/1/comments
[
{
"id": "25",
"news_id": "1",
"text": "Não sou faixa preta cumpadi, sou preto inteiris.",
"created_at": "1495928417",
"author": {
"name": "Nissim Ourfali",
"email": "nissimourfali@darkmira.com"
}
}, //... a lot of comments
]
/news/1
/users/57
//...
/medias/20
/news/1/comments
Como seria pedir
SOMENTE
o necessário e receber
EXATAMENTE
o que pediu de
UMA SÓ VEZ?
{
news(id: 1) {
title, text, created_at,
media {
url
},
user {
name
},
comments {
text,
author {
name
}
}
}
}
{
news(id: 1) {
title, text, created_at,
media {
url
},
user {
name
},
comments {
text,
author {
name
}
}
}
}
[
{
"title": "Joesley rompe com Tony Ramos",
"text": "Mussum, Ipsum, cacilds vidis...",
"created_at": "1495928417",
"media": {
"url":"http://news/media/65815736...
},
"user": {
"name": "Mad Max"
},
"comments": [
//...
]
}
]
História
Fevereiro 2012
Protótipo SuperGraph
História
Desenvolvimento inicial
História
Facebook Newsfeed API para iOS
Agosto 2012
História
Evolução
História
Primeira aparição pública
Janeiro 2015
História
Refactoring
História
Open Source
Julho 2015
História
Feedback da comunidade
História
Release
Setembro 2016
GraphQL.org
$ composer require webonyx/graphql-php
http://webonyx.github.io/graphql-php/
Schema
Descreve os dados
Cardápio
$userType = new ObjectType([
'name' => 'User',
'fields' => [
'id' => Type::nonNull(Type::id()),
'name' => Type::nonNull(Type::string()),
'email' => Type::nonNull(Type::string()),
'role' => Type::nonNull(Type::string()),
'created_at' => Type::nonNull(Type::int())
]
]);
$mediaType = new ObjectType([
'name' => 'Media',
'fields' => [
'id' => Type::nonNull(Type::id()),
'type' => Type::nonNull(Type::string()),
'filename' => Type::nonNull(Type::string()),
'size' => Type::nonNull(Type::string()),
'url' => Type::nonNull(Type::string())
]
]);
$commentType = new ObjectType([
'name' => 'Comment',
'fields' => [
'id' => Type::nonNull(Type::id()),
'text' => Type::nonNull(Type::string()),
'created_at' => Type::nonNull(Type::int()),
'author' => Type::nonNull(new ObjectType([
'name' => 'Author',
'fields' => [
'name' => Type::string(),
'email' => Type::string()
]
]))
]
]);
$newsType = new ObjectType([
'name' => 'News',
'fields' => [
'id' => Type::nonNull(Type::id()),
'user' => Type::nonNull($userType),
'media' => $mediaType,
'title' => Type::nonNull(Type::string()),
'excerpt' => Type::string(),
'text' => Type::nonNull(Type::string()),
'created_at' => Type::nonNull(Type::int()),
'status' => Type::nonNull(Type::string()),
'comments' => Type::listOf($commentType)
]
]);
Type System
Um serviço
GraphQL
é composto por
TYPES,
que por sua vez são
compostos por
FIELDS
Types
★ Int
★ Float
★ Boolean
★ String
★ ID
★ Object
Modificadores
★ List
★ Non-Null
Root Types
São tipos especiais de
objetos que ficam na raiz
do schema
Enquanto a MUTATION
é opcional, a QUERY
deve estar presente em
todo schema GraphQL
$mutationType = new ObjectType([
'name' => 'Mutation',
'fields' => [
'registerUser' => $registerUserMutation,
'registerComment' => $registerCommentMutation,
'reportContent' => $reportContentMutation
]
]);
$queryType = new ObjectType([
'name' => 'Query',
'fields' => [
'news' => $newsQuery,
'categories' => $categoriesQuery,
'users' => $usersQuery
],
]);
$schema = new Schema([
'query' => $queryType,
'mutation' => $mutationType
]);
Queries & Mutations
query{
news(id: 1) {
title, text, created_at,
media {
url
},
user {
name
},
comments {
text,
author {
name
}
}
}
}
$newsQuery = [
'type' => Type::listOf($newsType),
'args' => [
'id' => Type::id()
],
'resolve' => function ($root, $args) {
$id = $args['id'];
return NewsRepository::find($id);
}
];
MUTATION
são operações que
modificam os dados no
serviço
Nomenclatura imperativa
$registerUserMutation = [
'type' => $userType,
'args' => [
'name' => Type::nonNull(Type::string()),
'email' => Type::nonNull(Type::string()),
],
'resolve' => function ($root, $args) {
return NewsRepository::add($args);
}
];
mutation{
registerUser(
name: "Cyrille",
email: "cyrille@darkmira.com"
) {
id,
name,
email,
role,
created_at
}
}
Validação
Todo dado que entra
e sai do serviço GraphQL é
validado no
SCHEMA
mutation{
registerUser(name: 1) {
undefined_field
}
}
{
"errors": [
{
"message": "Argument "name" has invalid value 1.nExpected
type "String", found 1.",
"locations": [
{
"line": 2,
"column": 22
}
]
},
{
"message": "Cannot query field "undefined_field" on type
"User".",
"locations": [
{
"line": 3,
"column": 5
}
]
}
]
}
Resolvers
São os responsáveis por
resolver a QUERY, ou
MIGRATION, e retornar as
informações
Todo FIELD possui um
RESOLVER, mesmo
que de forma
implícita
O RESOLVER de um FIELD
filho recebe o resultado
do FIELD pai como
argumento
$newsQuery = [
'type' => Type::listOf($newsType),
'args' => [
'id' => Type::id()
],
'resolve' => function ($root, $args) {
$id = $args['id'];
return NewsRepository::find($id);
}
];
$newsType = new ObjectType([
'name' => 'News',
'fields' => [
'id' => Type::nonNull(Type::id()),
'user' => Type::nonNull($userType),
'media' => $mediaType,
'title' => Type::nonNull(Type::string()),
'excerpt' => [
'type' => Type::nonNull(Type::string()),
'resolve' => function ($news, $args) {
return 'Excerpt from: ' . $news->title;
}
],
'text' => Type::nonNull(Type::string()),
'created_at' => Type::nonNull(Type::int()),
'status' => Type::nonNull(Type::string()),
'comments' => Type::listOf($commentType )
]
]);
query {
news(id:1) {
id
title
excerpt
}
}
{
"data": {
"news": [
{
"id": "1",
"title": "Joesley rompe com ..." ,
"excerpt": "Excerpt from: Joesley
rompe com Tony Ramos"
}
]
}
}
Adeus versionamento
http://darkmira.com/api/v1
Quando um FIELD for
depreciado, é sinalizada a
mudança no SCHEMA e
definido o substituto
Endpoint único
CLIENT first
Entrega mais poder de
fogo para o frontend
Cada cliente consome o
serviço de acordo com a
sua necessidade, de
maneira eficiente. PC,
Mobile, Integrações...
Documentação
Documentação
Introspecção
Todo serviço
GraphQl
provê a navegação
por todo o
SCHEMA
A API já nasce documentada
{
__type(name: "News") {
name
fields {
name
}
}
}
{
"data": {
"__type": {
"name": "News",
"fields": [
{ "name": "id" },
{ "name": "user" },
{ "name": "media" },
{ "name": "title" }
//...
]
}
}
}
Experiência de
desenvolvimento
superior
Adoção
http://graphql.org/users
Frontend
Frontend
★ Relay
★ Apollo
★ Vanilla Js
Talk is cheap.
Show me the code!
Dúvidas?
Valeu!
https://joind.in/event/darkmira-tour-php-2017/do-rest-ao-graphql-com-php
@brunodasneves
Referências
★ http://graphql.org/
★ https://www.youtube.com/watch?v=zVNrqo9XGOs
★ https://github.com/chentsulin/awesome-graphql
★ http://webonyx.github.io/graphql-php
★ https://github.com/Youshido/GraphQL
★ https://dev-blog.apollodata.com/

More Related Content

What's hot

Object Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simplesObject Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simplesOtávio Calaça Xavier
 
Introdução ao MongoDB
Introdução ao MongoDBIntrodução ao MongoDB
Introdução ao MongoDBRodrigo Hjort
 
JavaScript e JQuery para Webdesigners
JavaScript e JQuery para WebdesignersJavaScript e JQuery para Webdesigners
JavaScript e JQuery para WebdesignersHarlley Oliveira
 
Programando em python dicionarios
Programando em python   dicionariosProgramando em python   dicionarios
Programando em python dicionariossamuelthiago
 
JQuery - JS 101
JQuery - JS 101JQuery - JS 101
JQuery - JS 101TheCoreh
 
Estruturas de dados em Python
Estruturas de dados em PythonEstruturas de dados em Python
Estruturas de dados em PythonRicardo Paiva
 
Aplicativos II - MySQL_part1
Aplicativos II - MySQL_part1Aplicativos II - MySQL_part1
Aplicativos II - MySQL_part1fabriciodenis
 
Fugindo das armadilhas do MVC
Fugindo das armadilhas do MVCFugindo das armadilhas do MVC
Fugindo das armadilhas do MVCEdiaimo Borges
 
Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP Luis Gustavo Almeida
 
JavaScript: prototipação, closure e encapsulamento
JavaScript: prototipação, closure e encapsulamentoJavaScript: prototipação, closure e encapsulamento
JavaScript: prototipação, closure e encapsulamentoRicardo Valeriano
 
Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Luis Gustavo Almeida
 

What's hot (20)

Object Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simplesObject Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simples
 
Introdução ao MongoDB
Introdução ao MongoDBIntrodução ao MongoDB
Introdução ao MongoDB
 
JavaScript e JQuery para Webdesigners
JavaScript e JQuery para WebdesignersJavaScript e JQuery para Webdesigners
JavaScript e JQuery para Webdesigners
 
JQuery
JQuery JQuery
JQuery
 
Escrevendo plugins JQuery
Escrevendo plugins JQueryEscrevendo plugins JQuery
Escrevendo plugins JQuery
 
Programando em python dicionarios
Programando em python   dicionariosProgramando em python   dicionarios
Programando em python dicionarios
 
JQuery - JS 101
JQuery - JS 101JQuery - JS 101
JQuery - JS 101
 
Estruturas de dados em Python
Estruturas de dados em PythonEstruturas de dados em Python
Estruturas de dados em Python
 
PHP ao Extremo
PHP ao ExtremoPHP ao Extremo
PHP ao Extremo
 
jQuery Simplificando o JavaScript
jQuery Simplificando o JavaScriptjQuery Simplificando o JavaScript
jQuery Simplificando o JavaScript
 
Aplicativos II - MySQL_part1
Aplicativos II - MySQL_part1Aplicativos II - MySQL_part1
Aplicativos II - MySQL_part1
 
Php curl - Coleta de dados na web
Php curl - Coleta de dados na webPhp curl - Coleta de dados na web
Php curl - Coleta de dados na web
 
Fugindo das armadilhas do MVC
Fugindo das armadilhas do MVCFugindo das armadilhas do MVC
Fugindo das armadilhas do MVC
 
Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP
 
Palestra de PDO
Palestra de PDOPalestra de PDO
Palestra de PDO
 
Jquery 2
Jquery 2Jquery 2
Jquery 2
 
JavaScript: prototipação, closure e encapsulamento
JavaScript: prototipação, closure e encapsulamentoJavaScript: prototipação, closure e encapsulamento
JavaScript: prototipação, closure e encapsulamento
 
NotORM
NotORMNotORM
NotORM
 
Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017
 
Meta-programacao em python
Meta-programacao em pythonMeta-programacao em python
Meta-programacao em python
 

Similar to Do REST ao GraphQL com PHP: Uma introdução concisa à API GraphQL

PHP Community Summit - Do REST ao GraphQL com PHP
PHP Community Summit - Do REST ao GraphQL com PHPPHP Community Summit - Do REST ao GraphQL com PHP
PHP Community Summit - Do REST ao GraphQL com PHPBruno Neves Menezes
 
Cafe com Tom - ExtJS 4
Cafe com Tom - ExtJS 4Cafe com Tom - ExtJS 4
Cafe com Tom - ExtJS 4Loiane Groner
 
Palestra Novidades da linguagem C# 6
Palestra Novidades da linguagem C# 6Palestra Novidades da linguagem C# 6
Palestra Novidades da linguagem C# 6Renato Haddad
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o JavascriptMichel Ribeiro
 
ORM: Sendo produtivo com NHibernate
ORM: Sendo produtivo com NHibernateORM: Sendo produtivo com NHibernate
ORM: Sendo produtivo com NHibernateJuliano Oliveira
 
Persistência de Dados no SQLite com Room
Persistência de Dados no SQLite com RoomPersistência de Dados no SQLite com Room
Persistência de Dados no SQLite com RoomNelson Glauber Leal
 
Unidade4.1 Oracle Or
Unidade4.1 Oracle OrUnidade4.1 Oracle Or
Unidade4.1 Oracle OrUFU
 
Javascript Recuperando Dados De Formularios
Javascript    Recuperando Dados De FormulariosJavascript    Recuperando Dados De Formularios
Javascript Recuperando Dados De Formulariosguestd9e271
 
Passagem de Objetos entre Java e Oracle
Passagem de Objetos entre Java e OraclePassagem de Objetos entre Java e Oracle
Passagem de Objetos entre Java e OracleAndré Reis
 
Busca e análise de dados escalável em tempo-real
Busca e análise de dados escalável em tempo-realBusca e análise de dados escalável em tempo-real
Busca e análise de dados escalável em tempo-realAécio Santos
 
Fazendo uma aplicação cliente/servidor (e algumas dicas...)
Fazendo uma aplicação cliente/servidor (e algumas dicas...)Fazendo uma aplicação cliente/servidor (e algumas dicas...)
Fazendo uma aplicação cliente/servidor (e algumas dicas...)Makoto Miyagawa
 
LaravelSP - MySQL 5.7: introdução ao JSON Data Type
LaravelSP - MySQL 5.7: introdução ao JSON Data TypeLaravelSP - MySQL 5.7: introdução ao JSON Data Type
LaravelSP - MySQL 5.7: introdução ao JSON Data TypeGabriela Ferrara
 
J query javascript para seres humanos
J query   javascript para seres humanosJ query   javascript para seres humanos
J query javascript para seres humanosnobios
 

Similar to Do REST ao GraphQL com PHP: Uma introdução concisa à API GraphQL (20)

PHP Community Summit - Do REST ao GraphQL com PHP
PHP Community Summit - Do REST ao GraphQL com PHPPHP Community Summit - Do REST ao GraphQL com PHP
PHP Community Summit - Do REST ao GraphQL com PHP
 
Cafe com Tom - ExtJS 4
Cafe com Tom - ExtJS 4Cafe com Tom - ExtJS 4
Cafe com Tom - ExtJS 4
 
Palestra Novidades da linguagem C# 6
Palestra Novidades da linguagem C# 6Palestra Novidades da linguagem C# 6
Palestra Novidades da linguagem C# 6
 
TDC 2011 - Ext JS 4
TDC 2011 - Ext JS 4TDC 2011 - Ext JS 4
TDC 2011 - Ext JS 4
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o Javascript
 
ORM: Sendo produtivo com NHibernate
ORM: Sendo produtivo com NHibernateORM: Sendo produtivo com NHibernate
ORM: Sendo produtivo com NHibernate
 
Meetup MUG-RS KingHost
Meetup MUG-RS KingHostMeetup MUG-RS KingHost
Meetup MUG-RS KingHost
 
Persistência de Dados no SQLite com Room
Persistência de Dados no SQLite com RoomPersistência de Dados no SQLite com Room
Persistência de Dados no SQLite com Room
 
Unidade4.1 Oracle Or
Unidade4.1 Oracle OrUnidade4.1 Oracle Or
Unidade4.1 Oracle Or
 
NoSQL e MongoDB
NoSQL e MongoDBNoSQL e MongoDB
NoSQL e MongoDB
 
Aula 8 php
Aula 8 phpAula 8 php
Aula 8 php
 
Javascript Recuperando Dados De Formularios
Javascript    Recuperando Dados De FormulariosJavascript    Recuperando Dados De Formularios
Javascript Recuperando Dados De Formularios
 
NoSQL e MongoDB - ETEC
NoSQL e MongoDB - ETECNoSQL e MongoDB - ETEC
NoSQL e MongoDB - ETEC
 
Aula android 04
Aula android 04Aula android 04
Aula android 04
 
Passagem de Objetos entre Java e Oracle
Passagem de Objetos entre Java e OraclePassagem de Objetos entre Java e Oracle
Passagem de Objetos entre Java e Oracle
 
Busca e análise de dados escalável em tempo-real
Busca e análise de dados escalável em tempo-realBusca e análise de dados escalável em tempo-real
Busca e análise de dados escalável em tempo-real
 
Fazendo uma aplicação cliente/servidor (e algumas dicas...)
Fazendo uma aplicação cliente/servidor (e algumas dicas...)Fazendo uma aplicação cliente/servidor (e algumas dicas...)
Fazendo uma aplicação cliente/servidor (e algumas dicas...)
 
LaravelSP - MySQL 5.7: introdução ao JSON Data Type
LaravelSP - MySQL 5.7: introdução ao JSON Data TypeLaravelSP - MySQL 5.7: introdução ao JSON Data Type
LaravelSP - MySQL 5.7: introdução ao JSON Data Type
 
Bread board
Bread boardBread board
Bread board
 
J query javascript para seres humanos
J query   javascript para seres humanosJ query   javascript para seres humanos
J query javascript para seres humanos
 

Do REST ao GraphQL com PHP: Uma introdução concisa à API GraphQL