Más contenido relacionado La actualidad más candente (20) Similar a Do REST ao GraphQL com PHP (20) Do REST ao GraphQL com PHP1. Do REST ao GraphQL
com PHP
Bruno Neves
@brunodasneves
brunonm@gmail.com
4. 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"
}
7. 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
]
10. {
news(id: 1) {
title, text, created_at,
media {
url
},
user {
name
},
comments {
text,
author {
name
}
}
}
}
11. {
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": [
//...
]
}
]
27. $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())
]
]);
28. $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())
]
]);
29. $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()
]
]))
]
]);
30. $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)
]
]);
38. $mutationType = new ObjectType([
'name' => 'Mutation',
'fields' => [
'registerUser' => $registerUserMutation,
'registerComment' => $registerCommentMutation,
'reportContent' => $reportContentMutation
]
]);
$queryType = new ObjectType([
'name' => 'Query',
'fields' => [
'news' => $newsQuery,
'categories' => $categoriesQuery,
'users' => $usersQuery
],
]);
39. $schema = new Schema([
'query' => $queryType,
'mutation' => $mutationType
]);
41. 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);
}
];
44. $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
}
}
46. Todo dado que entra
e sai do serviço GraphQL é
validado no
SCHEMA
51. O RESOLVER de um FIELD
filho recebe o resultado
do FIELD pai como
argumento
52. $newsQuery = [
'type' => Type::listOf($newsType),
'args' => [
'id' => Type::id()
],
'resolve' => function ($root, $args) {
$id = $args['id'];
return NewsRepository::find($id);
}
];
53. $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 )
]
]);
56. Quando um FIELD for
depreciado, é sinalizada a
mudança no SCHEMA e
definido o substituto
60. Cada cliente consome o
serviço de acordo com a
sua necessidade, de
maneira eficiente. PC,
Mobile, Integrações...
65. {
__type(name: "News") {
name
fields {
name
}
}
}
{
"data": {
"__type": {
"name": "News",
"fields": [
{ "name": "id" },
{ "name": "user" },
{ "name": "media" },
{ "name": "title" }
//...
]
}
}
}