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.
'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