Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

of

Do REST ao GraphQL com PHP Slide 1 Do REST ao GraphQL com PHP Slide 2 Do REST ao GraphQL com PHP Slide 3 Do REST ao GraphQL com PHP Slide 4 Do REST ao GraphQL com PHP Slide 5 Do REST ao GraphQL com PHP Slide 6 Do REST ao GraphQL com PHP Slide 7 Do REST ao GraphQL com PHP Slide 8 Do REST ao GraphQL com PHP Slide 9 Do REST ao GraphQL com PHP Slide 10 Do REST ao GraphQL com PHP Slide 11 Do REST ao GraphQL com PHP Slide 12 Do REST ao GraphQL com PHP Slide 13 Do REST ao GraphQL com PHP Slide 14 Do REST ao GraphQL com PHP Slide 15 Do REST ao GraphQL com PHP Slide 16 Do REST ao GraphQL com PHP Slide 17 Do REST ao GraphQL com PHP Slide 18 Do REST ao GraphQL com PHP Slide 19 Do REST ao GraphQL com PHP Slide 20 Do REST ao GraphQL com PHP Slide 21 Do REST ao GraphQL com PHP Slide 22 Do REST ao GraphQL com PHP Slide 23 Do REST ao GraphQL com PHP Slide 24 Do REST ao GraphQL com PHP Slide 25 Do REST ao GraphQL com PHP Slide 26 Do REST ao GraphQL com PHP Slide 27 Do REST ao GraphQL com PHP Slide 28 Do REST ao GraphQL com PHP Slide 29 Do REST ao GraphQL com PHP Slide 30 Do REST ao GraphQL com PHP Slide 31 Do REST ao GraphQL com PHP Slide 32 Do REST ao GraphQL com PHP Slide 33 Do REST ao GraphQL com PHP Slide 34 Do REST ao GraphQL com PHP Slide 35 Do REST ao GraphQL com PHP Slide 36 Do REST ao GraphQL com PHP Slide 37 Do REST ao GraphQL com PHP Slide 38 Do REST ao GraphQL com PHP Slide 39 Do REST ao GraphQL com PHP Slide 40 Do REST ao GraphQL com PHP Slide 41 Do REST ao GraphQL com PHP Slide 42 Do REST ao GraphQL com PHP Slide 43 Do REST ao GraphQL com PHP Slide 44 Do REST ao GraphQL com PHP Slide 45 Do REST ao GraphQL com PHP Slide 46 Do REST ao GraphQL com PHP Slide 47 Do REST ao GraphQL com PHP Slide 48 Do REST ao GraphQL com PHP Slide 49 Do REST ao GraphQL com PHP Slide 50 Do REST ao GraphQL com PHP Slide 51 Do REST ao GraphQL com PHP Slide 52 Do REST ao GraphQL com PHP Slide 53 Do REST ao GraphQL com PHP Slide 54 Do REST ao GraphQL com PHP Slide 55 Do REST ao GraphQL com PHP Slide 56 Do REST ao GraphQL com PHP Slide 57 Do REST ao GraphQL com PHP Slide 58 Do REST ao GraphQL com PHP Slide 59 Do REST ao GraphQL com PHP Slide 60 Do REST ao GraphQL com PHP Slide 61 Do REST ao GraphQL com PHP Slide 62 Do REST ao GraphQL com PHP Slide 63 Do REST ao GraphQL com PHP Slide 64 Do REST ao GraphQL com PHP Slide 65 Do REST ao GraphQL com PHP Slide 66 Do REST ao GraphQL com PHP Slide 67 Do REST ao GraphQL com PHP Slide 68 Do REST ao GraphQL com PHP Slide 69 Do REST ao GraphQL com PHP Slide 70 Do REST ao GraphQL com PHP Slide 71 Do REST ao GraphQL com PHP Slide 72 Do REST ao GraphQL com PHP Slide 73 Do REST ao GraphQL com PHP Slide 74
Upcoming SlideShare
What to Upload to SlideShare
Next
Download to read offline and view in fullscreen.

0 Likes

Share

Download to read offline

Do REST ao GraphQL com PHP

Download to read offline

Apresentação ministrada no Darkmira Tour PHP 2017, no dia 26/05/2017.
Aberto para a comunidade em 2015, o GraphQL surgiu como uma alternativa poderosa, eficiente e bem documentada para construção de API’s. Foi desenvolvida e utilizada pelo Facebook por mais de 3 anos antes de sua publicação. Nessa conversa abordaremos os fundamentos da especificação, as principais diferenças com o REST e como desenvolver uma API GraphQL utilizando PHP.

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all
  • Be the first to like this

Do REST ao GraphQL com PHP

  1. 1. Do REST ao GraphQL com PHP Bruno Neves @brunodasneves brunonm@gmail.com
  2. 2. Roteiro ★ REST & GraphQL ★ História ★ Especificação / Linguagem ★ PHP
  3. 3. App Newsfeed
  4. 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" }
  5. 5. GET /users/57 { "id": "57", "name": "Mad Max", "email": "madmax@darkmira.com", "role": "WRITER", "created_at": "1495928417" }
  6. 6. GET /medias/20 { "id": "20", "type": "image/jpeg", "filename": "friboi.jpg", "size": "204800", "url": "http://news/media/65815736d29cc094a2d784c338066029" }
  7. 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 ]
  8. 8. /news/1 /users/57 //... /medias/20 /news/1/comments
  9. 9. Como seria pedir SOMENTE o necessário e receber EXATAMENTE o que pediu de UMA SÓ VEZ?
  10. 10. { news(id: 1) { title, text, created_at, media { url }, user { name }, comments { text, author { name } } } }
  11. 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": [ //... ] } ]
  12. 12. História Fevereiro 2012 Protótipo SuperGraph
  13. 13. História Desenvolvimento inicial
  14. 14. História Facebook Newsfeed API para iOS Agosto 2012
  15. 15. História Evolução
  16. 16. História Primeira aparição pública Janeiro 2015
  17. 17. História Refactoring
  18. 18. História Open Source Julho 2015
  19. 19. História Feedback da comunidade
  20. 20. História Release Setembro 2016
  21. 21. GraphQL.org
  22. 22. $ composer require webonyx/graphql-php http://webonyx.github.io/graphql-php/
  23. 23. Schema
  24. 24. Descreve os dados
  25. 25. Cardápio
  26. 26. $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()) ] ]);
  27. 27. $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()) ] ]);
  28. 28. $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() ] ])) ] ]);
  29. 29. $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) ] ]);
  30. 30. Type System
  31. 31. Um serviço GraphQL é composto por TYPES, que por sua vez são compostos por FIELDS
  32. 32. Types ★ Int ★ Float ★ Boolean ★ String ★ ID ★ Object
  33. 33. Modificadores ★ List ★ Non-Null
  34. 34. Root Types
  35. 35. São tipos especiais de objetos que ficam na raiz do schema
  36. 36. Enquanto a MUTATION é opcional, a QUERY deve estar presente em todo schema GraphQL
  37. 37. $mutationType = new ObjectType([ 'name' => 'Mutation', 'fields' => [ 'registerUser' => $registerUserMutation, 'registerComment' => $registerCommentMutation, 'reportContent' => $reportContentMutation ] ]); $queryType = new ObjectType([ 'name' => 'Query', 'fields' => [ 'news' => $newsQuery, 'categories' => $categoriesQuery, 'users' => $usersQuery ], ]);
  38. 38. $schema = new Schema([ 'query' => $queryType, 'mutation' => $mutationType ]);
  39. 39. Queries & Mutations
  40. 40. 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); } ];
  41. 41. MUTATION são operações que modificam os dados no serviço
  42. 42. Nomenclatura imperativa
  43. 43. $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 } }
  44. 44. Validação
  45. 45. Todo dado que entra e sai do serviço GraphQL é validado no SCHEMA
  46. 46. 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 } ] } ] }
  47. 47. Resolvers
  48. 48. São os responsáveis por resolver a QUERY, ou MIGRATION, e retornar as informações
  49. 49. Todo FIELD possui um RESOLVER, mesmo que de forma implícita
  50. 50. O RESOLVER de um FIELD filho recebe o resultado do FIELD pai como argumento
  51. 51. $newsQuery = [ 'type' => Type::listOf($newsType), 'args' => [ 'id' => Type::id() ], 'resolve' => function ($root, $args) { $id = $args['id']; return NewsRepository::find($id); } ];
  52. 52. $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 ) ] ]);
  53. 53. query { news(id:1) { id title excerpt } } { "data": { "news": [ { "id": "1", "title": "Joesley rompe com ..." , "excerpt": "Excerpt from: Joesley rompe com Tony Ramos" } ] } }
  54. 54. Adeus versionamento http://darkmira.com/api/v1
  55. 55. Quando um FIELD for depreciado, é sinalizada a mudança no SCHEMA e definido o substituto
  56. 56. Endpoint único
  57. 57. CLIENT first
  58. 58. Entrega mais poder de fogo para o frontend
  59. 59. Cada cliente consome o serviço de acordo com a sua necessidade, de maneira eficiente. PC, Mobile, Integrações...
  60. 60. Documentação
  61. 61. Documentação Introspecção
  62. 62. Todo serviço GraphQl provê a navegação por todo o SCHEMA
  63. 63. A API já nasce documentada
  64. 64. { __type(name: "News") { name fields { name } } } { "data": { "__type": { "name": "News", "fields": [ { "name": "id" }, { "name": "user" }, { "name": "media" }, { "name": "title" } //... ] } } }
  65. 65. Experiência de desenvolvimento superior
  66. 66. Adoção
  67. 67. http://graphql.org/users
  68. 68. Frontend
  69. 69. Frontend ★ Relay ★ Apollo ★ Vanilla Js
  70. 70. Talk is cheap. Show me the code!
  71. 71. Dúvidas?
  72. 72. Valeu! https://joind.in/event/darkmira-tour-php-2017/do-rest-ao-graphql-com-php @brunodasneves
  73. 73. 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/

Apresentação ministrada no Darkmira Tour PHP 2017, no dia 26/05/2017. Aberto para a comunidade em 2015, o GraphQL surgiu como uma alternativa poderosa, eficiente e bem documentada para construção de API’s. Foi desenvolvida e utilizada pelo Facebook por mais de 3 anos antes de sua publicação. Nessa conversa abordaremos os fundamentos da especificação, as principais diferenças com o REST e como desenvolver uma API GraphQL utilizando PHP.

Views

Total views

1,220

On Slideshare

0

From embeds

0

Number of embeds

24

Actions

Downloads

8

Shares

0

Comments

0

Likes

0

×