DEV Community

loading...
Cover image for GraphQL con Laravel

GraphQL con Laravel

joselfonseca profile image Jose Luis Fonseca ・1 min read

https://github.com/joselfonseca/laravel-graphql-demo

Si has escuchado sobre GraphQL y has visto que casi todo lo que hay en internet sobre él es en Node o React, debes saber que también existen muchas implementaciones en otros lenguajes y frameworks. Afortunadamente en PHP hay una implementación que podemos usar (http://webonyx.github.io/graphql-php/) y aun mejor una implementación el Laravel que se llama LightHouse PHP

LightHouse utiliza Eloquent para acceder a la base de datos a partir del Schema que definimos, también nos da muchas herramientas para implementar nuestro servidor GraphQL usando directivas que nos permiten utilizar las herramientas que el mismo framework nos da por fuera de la implementación de GraphQL como Middleware, autenticación y otros.

Una de las cosas que mas me ha gustado de LightHouse es que es fácil de extender, se pueden crear plugins o paquetes que se pueden re utilizar via composer para agregar funcionalidad a el servidor GraphQL, por ejemplo yo he podido hacer un pequeño plugin para usar autenticación con Passport que ya está disponible en Packagist.

https://packagist.org/packages/joselfonseca/lighthouse-graphql-passport-auth

Si quires aprender un poco sobre como usar LightHouse PHP en Laravel, como instalarlo y empezar a desarrollar tu GraphQL API, te invito a ver a el Live coding que hice en compañía de Laraveles.

Discussion (1)

pic
Editor guide
Collapse
dagume profile image
Daniel Guecha

hola Jose, me he encontrdo con un problema de al momento de crear una Interface pero es en la parte de resolver con lightHouse, y que no logro entender, me podrias orientar?, muchas gracias.

I have a problem, I have contacts but it is divided into Person or company, create an interface but at the moment of executing it it generates an error:

#contact types
enum contactType{
    persona @enum(value: 2)
    empresa @enum(value: 3)
}
enum contactIdType{
    cedula @enum(value: 1)
    nit @enum(value: 2)
    pasaporte @enum(value: 3)
    cedula extranjera @enum(value: 4)
}
interface Contact{
    id_contact:ID!
    type:contactType!
    name:String!
    identification_type:contactIdType!
    identification_number:Int!
    email:String!
    phones:String!
    state:Int!
    address:String
    web_site:String
}

type Person implements Contact{
    id_contact:ID!
    id_parent_contact:Int
    id_job:Int
    type:contactType!
    name:String!
    lastname:String
    identification_type:contactIdType!
    identification_number:Int!
    email:String!
    phones:String!
    state:Int!
    address:String
    web_site:String
}

type Company implements Contact{
    id_contact:ID!
    type:contactType!
    name:String!
    identification_type:contactIdType!
    identification_number:Int!
    email:String!
    phones:String!
    state:Int!
    locate:String
    city:String
    address:String
    web_site:String
}

Query:

type Query {    
    #Contacts
    contacts: [Contact!]! @all(model: "App\\Contact")
    contacts_paginator: [Contact]! @paginate(type: "paginator" model: "App\\Contact")
    contact(name: String! @eq): Contact @find(model: "App\\Contact")

}

///////////////////////////////////////////////////////

query{
  contacts{
    name
    type     
  }
}


`
result:

`

{
  "errors": [
    {
      "debugMessage": "Abstract type Contact must resolve to an Object type at runtime for field Query.contacts with value \"{\"id_contact\":4,\"id_parent_contact\":null,\"id_job\":null,\"type\":2,\"name\":\"Laura\",\"lastname\":\"Sanchez\",\"identification_type\":1,\"identification_number\":1049342129,\"email\":\"laura@gmail.com\",\"phones\":\"3203428890\",\"state\":1,\"locate\":null,\"city\":null,\"address\":null,\"web_site\":null}\", received \"Contact\". Either the Contact type should provide a \"resolveType\" function or each possible type should provide an \"isTypeOf\" function.",
      "message": "Internal server error",
      "extensions": {
        "category": "internal"
      },
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": [
        "contacts",
        0
      ]


`

i am working with laravel lighthouse