laravel5.8 GraphQL

crear la aplicacion

composer create-project --prefer-dist laravel/laravel winestore

crear el modelo

php artisan make:model Wine -m

editamos el archivo de migraciones generado correspondiente al modelo:

public function up() { Schema::create('wines', function (Blueprint $table) { $table->increments('id'); $table->string('name', 50); $table->text('description'); $table->string('color', 10); $table->string('grape_variety', 50); $table->string('country', 50); $table->timestamps(); }); }

por facilidad creamos un seeder:

php artisan make:seeder WinesTableSeeder

y editamos el archivo generado WinesTableSeeder.php:


public function run()
{
Wine::create([
'name' => 'Classic Chianti',
'description' => 'Un vino de cuerpo medio caracterizado por una frescura maravillosa con un final persistente y afrutado',
'color' => 'red',
'grape_variety' => 'Sangiovese',
'country' => 'Italy'
]);

Wine::create([
'name' => 'Bordeaux',
'description' => 'Un vino con aromas frutales y sabores de mora, cereza oscura, vainilla, grano de café y regaliz. Los vinos suelen ser concentrados, potentes, firmes y tánicos',
'color' => 'red',
'grape_variety' => 'Merlot',
'country' => 'France'
]);

Wine::create([
'name' => 'White Zinfandel',
'description' => 'Abreviado a menudo como White Zin, es un vino seco a dulce, rosado',
'color' => 'rosé',
'grape_variety' => 'Zinfandel',
'country' => 'USA'
]);

Wine::create([
'name' => 'Port',
'description' => 'Un vino tinto dulce fortificado, a menudo servido como un vino de postre',
'color' => 'red',
'grape_variety' => 'Touriga Nacional',
'country' => 'Portugal'
]);

Wine::create([
'name' => 'Prosecco',
'description' => 'Es un vino blanco seco (brut), a veces con un sabor dulce a manzana verde, melón dulce, pera y madreselva',
'color' => 'white',
'grape_variety' => 'Glera',
'country' => 'Italy'
]);
}


en el archivo DatabaseSeeder.php
invocamos al seeder:

public function run()
{
$this->call(WinesTableSeeder::class);
}

instalamos una libreria que nos permita crear facilmente Schemas y Types:

composer require rebing/graphql-laravel

luego debemos ejecutar este comando para copiar el archivo graphql.php de la carpeta del vendor a la carpeta config de la aplicacion:

php artisan vendor:publish --provider="Rebing\GraphQL\GraphQLServiceProvider"

Crear los Types:

php artisan make:graphql:type WineType

namespace App\GraphQL\Type;

use App\Wine;
use GraphQL\Type\Definition\Type;
use Rebing\GraphQL\Support\Type as GraphQLType;

class WineType extends GraphQLType
{
protected $attributes = [
'name' => 'Wine',
'description' => 'Detalles sobre un vino',
'model' => Wine::class
];

public function fields()
{
return [
'id' => [
'type' => Type::nonNull(Type::int()),
'description' => 'Id del vino',
],
'name' => [
'type' => Type::nonNull(Type::string()),
'description' => 'nombre del vino',
],
'description' => [
'type' => Type::nonNull(Type::string()),
'description' => 'descripcion corta del vino',
],
'color' => [
'type' => Type::nonNull(Type::string()),
'description' => 'color del vino',
],
'grape_variety' => [
'type' => Type::nonNull(Type::string()),
'description' => 'variedad de uva del vino',
],
'country' => [
'type' => Type::nonNull(Type::string()),
'description' => 'pais de origen del vino',
]
];
}
}

Crear las queries GraphQl

php artisan make:graphql:query WinesQuery

namespace App\GraphQL\Query;

use App\Wine;
use GraphQL\Type\Definition\Type;
use Rebing\GraphQL\Support\Query;
use GraphQL;
use Rebing\GraphQL\Support\SelectFields;

class WinesQuery extends Query
{
protected $attributes = [
'name' => 'wines',
];

public function type()
{
return Type::listOf(GraphQL::type('Wine'));
}

public function args()
{
return [
'id' => [
'name' => 'id',
'type' => Type::int()
],
];
}
public function resolve($root, $args)
{
if(isset($args['id']))
{
return Wine::where('id','=',$args['id'])->get();
}
return Wine::all();

}
}

donde,
Método type lo que hace es definir que es lo que devolveremos, le decimos que es una lista (array) de vinos, que previamente creamos y añadimos a la config de graphql.
Método args podemos pasarle atributos a una consulta, por ejemplo, orderby, order, numero de pagina, etc. Nosotros le pasamos el id para que tenga la posibilidad de solo obtener un vino
Método resolve: Básicamente aquí devolvemos el array con los datos que se solicitaron, la librería ya sabe asociar las relaciones y lo que requiere por tanto solo hay que llamar a Eloquent como hacemos habitualmente. También aquí podemos hacer filtros o alguna necesidad especial que tengamos.

registramos esta Query en graphql.php

'schemas' => [
'default' => [
'query' => [
'wines' => App\GraphQL\Query\WinesQuery::class,
]
],
],




 y tambien el Type:

'types' => [
'Wine' => App\GraphQL\Types\WineType::class,
],


Creamos las tablas y las poblamos con el seed:

php artisan migrate
php artisan db:seed # run the server
Levantamos el servidor interno:

php artisan serve

para probar nuestra queries podemos usar una extension de Chrome:

https://chrome.google.com/webstore/detail/chromeiql/fkkiamalmpiidkljmicmjfbieiclmeij?source=post_page---------------------------

y escribimos nuestra url :

http://127.0.0.1:8000/graphql

{
  wines {
    name, color
    }
}

traeria todos los vinos mostrando su nombre y color


{
  wines(id:1){
    id,name
  }
}

traeria el id y el nombre del vino con id=1

{
  "data": {
    "wines": [
      {
        "id": 1,
        "name": "Classic Chianti"
      }
    ]
  }
}

fuente:

https://auth0.com/blog/developing-and-securing-graphql-apis-with-laravel/

https://medium.com/@devfelipe.mansilla/usando-graphql-con-laravel-446f0de02424

No hay comentarios:

Publicar un comentario

linux ubuntu mint actualizar chrome

 desde una terminal: $ sudo apt update $ sudo apt install google-chrome-stable