Introdução ao GraphQL no Laravel
Posted on: January 29, 2020 12:18 PM
Posted by: Renato
Categories: Variados
Views: 585
Introdução ao GraphQL no Laravel
CHIMEZIE ENYINNAYA - 8 DE JUNHO DE 2018
Desde que foi lançado publicamente em 2015 pelo Facebook, empresas como o GitHub e o Pinterest começaram a usar o GraphQL em produção. O GraphQL introduz muitos aprimoramentos sobre o REST. Existe esse equívoco de que o GraphQL é todo sobre JavaScript. Muitas linguagens de programação diferentes suportam o GraphQL. Portanto, neste tutorial, ajudarei a corrigir esse equívoco, mostrando-lhe como começar a usar o GraphQL no Laravel.
Pré-requisitos
Este tutorial pressupõe o seguinte:- Conhecimento básico do GraphQL
- Conhecimento básico do Laravel
- PHP
- SQLite
- Compositor
- Instalador do Laravel
O que nós estaremos construindo
Nós estaremos usando o conceito de uma lista de tarefas.Crie um novo aplicativo Laravel
Vamos começar criando um novo projeto do Laravel. Eu vou estar usando o instalador do Laravel: $ laravel new laravel-graphql-tasks
Para usar o GraphQL é o nosso aplicativo Laravel, estaremos fazendo uso de um pacote chamado laravel-graphql . Vamos instalar o pacote:
$ cd laravel-graphql-tasks
$ composer require folklore/graphql
Nota: O restante do tutorial assume que você já está no laravel-graphql-tasks
diretório
Uma vez feita a instalação, vamos executar o comando abaixo:
$ php artisan vendor:publish --provider="Folklore\GraphQL\ServiceProvider"
Isso criará dois novos arquivos: o config/graphql.php
que é o arquivo de configuração do pacote e resources/views/vendor/graphql/graphiql.php
que nos permitirá testar nosso aplicativo usando o GraphiQL.
Crie um modelo de tarefa
Vamos criar um modelo de tarefa e seu arquivo de migração correspondente. Para fazer isso, execute o comando abaixo: $ php artisan make:model Task -m
Feito isso, abra o arquivo de migração que foi gerado e atualize o up
método conforme abaixo:
// database/migrations/TIMESTAMP_create_tasks_table.php
public function up()
{
Schema::create('tasks', function (Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->boolean('is_completed')->default(0);
$table->timestamps();
});
}
Adicionamos colunas básicas à tasks
tabela. Nós definimos a is_completed
coluna como false
padrão.
Em seguida, precisamos executar as migrações. Mas antes de podermos fazer isso, precisamos configurar nosso banco de dados. Para o propósito deste tutorial, usaremos o SQLite. Então, crie um database.sqlite
arquivo dentro do database
diretório. Por último, vamos atualizar o .env
arquivo como abaixo:
// .env
DB_CONNECTION=sqlite
DB_DATABASE=FULL_PATH_TO_DATABASE_SQLITE
Agora vamos rodar a migração:
$ php artisan migrate
Semeadora de banco de dados
Para ter alguns dados para trabalhar, vamos criar uma semeadora de banco de dados para preencher a tabela de tarefas com alguns dados. Execute o comando abaixo: $ php artisan make:seeder TasksTableSeeder
Em seguida, dentro do database/factories
diretório, crie um novo TaskFactory.php
arquivo e cole o código abaixo nele:
// database/factories/TaskFactory.php
<?php
use Faker\Generator as Faker;
$factory->define(App\Task::class, function (Faker $faker) {
return [
'title' => $faker->sentence,
];
});
Apenas especificamos o valor da title
coluna, uma vez que já definimos a is_completed
coluna como false
padrão.
Em seguida, atualize o run
método database/seeds/TasksTableSeeder.php
como abaixo:
// database/seeds/TasksTableSeeder.php
public function run()
{
factory(App\Task::class, 5)->create();
}
Agora, podemos executar o semeador de banco de dados:
$ php artisan db:seed --class=TasksTableSeeder
Definindo Esquemas
Com a configuração fora do caminho, vamos começar a definir os esquemas para nossa lista de tarefas. Os esquemas descrevem como os dados são formados e quais dados no servidor podem ser consultados. Esquemas podem ser de dois tipos: Consulta e Mutação. Nossos esquemas podem ser definidos internamenteconfig/graphql.php
. Nós vamos atualizar este arquivo em breve.
Criando consulta GraphQL
Nossa lista de tarefas terá apenas uma consulta, que será buscar todas as tarefas que foram adicionadas ao servidor GraphQL. Antes de podermos criar uma consulta, precisamos primeiro definir um tipo. Então, vamos definir umTask
tipo. Para fazer isso, crie um novo GraphQL
diretório dentro do app
diretório. Dentro do GraphQL
diretório, crie um novo Type
diretório. Dentro do app/GraphQL/Type
diretório, crie um novo TaskType.php
arquivo e cole o seguinte código:
// app/GraphQL/Type/TaskType.php
<?php
namespace App\GraphQL\Type;
use GraphQL\Type\Definition\Type;
use Folklore\GraphQL\Support\Type as GraphQLType;
class TaskType extends GraphQLType
{
protected $attributes = [
'name' => 'Task',
'description' => 'A task'
];
public function fields()
{
return [
'id' => [
'type' => Type::nonNull(Type::int()),
'description' => 'The id of a task'
],
'title' => [
'type' => Type::string(),
'description' => 'The title of a task'
],
'is_completed' => [
'type' => Type::boolean(),
'description' => 'The status of a task'
],
];
}
}
Nós damos ao tipo um nome e uma descrição. Além disso, definimos os campos ( id
, title
, is_completed
) que o Task
tipo terá.
Agora vamos criar a consulta. Crie um novo Query
diretório dentro app/GraphQL
e dentro do Query
diretório, crie um novo TasksQuery.php
arquivo e cole o seguinte código nele:
// app/GraphQL/Query/TasksQuery.php
<?php
namespace App\GraphQL\Query;
use GraphQL;
use GraphQL\Type\Definition\Type;
use Folklore\GraphQL\Support\Query;
use App\Task;
class TasksQuery extends Query
{
protected $attributes = [
'name' => 'tasks'
];
public function type()
{
return Type::listOf(GraphQL::type('Task'));
}
public function resolve($root, $args)
{
return Task::all();
}
}
Nós damos um nome à consulta e tasks
, em seguida, definimos o tipo de consulta (que é o Task
tipo que definimos acima). Como queremos que a consulta busque todas as tarefas que foram criadas, usamos o listOf
tipo no Task
tipo, que retornará uma matriz de tarefas. Por fim, definimos um resolve
método que manipulará a busca real das tarefas. Estamos simplesmente retornando todas as tarefas do banco de dados.
Com nosso tipo e consulta definidos, vamos adicioná-los a config/graphql.php
:
// config/graphql.php
'schemas' => [
'default' => [
'query' => [
'tasks' => \App\GraphQL\Query\TasksQuery::class,
],
// ...
]
],
'types' => [
'Task' => \App\GraphQL\Type\TaskType::class,
],
Criando mutações no GraphQL
Mutações são usadas para executar operações de gravação. Vamos criar duas mutações, que serão usadas para adicionar uma nova tarefa e atualizar o status de uma tarefa, respectivamente. Crie um novoMutation
diretório dentro app/GraphQL
e dentro Mutation
, crie um novo NewTaskMutation.php
arquivo e cole o seguinte código nele:
// app/GraphQL/Mutation/NewTaskMutation.php
<?php
namespace App\GraphQL\Mutation;
use GraphQL;
use GraphQL\Type\Definition\Type;
use Folklore\GraphQL\Support\Mutation;
use App\Task;
class NewTaskMutation extends Mutation
{
protected $attributes = [
'name' => 'newTask'
];
public function type()
{
return GraphQL::type('Task');
}
public function args()
{
return [
'title' => [
'name' => 'title',
'type' => Type::nonNull(Type::string())
]
];
}
public function resolve($root, $args)
{
$task = new Task();
$task->title = $args['title'];
$task->save();
return Task::find($task->id);
}
}
Nós damos um nome à mutação newTask
, então definimos o tipo que esta mutação retornará. Nós definimos um args
método que retorna uma matriz de argumentos que a mutação pode aceitar. A mutação aceitará apenas um argumento, que é o título de uma tarefa. Por fim, definimos um resolve
método que faz a inserção real da nova tarefa no banco de dados e retorna a tarefa recém-criada.
E se quisermos validar os dados antes de adicionar uma nova tarefa? Bem, é possível adicionar regras de validação a uma mutação. O pacote laravel-graphql usa o laravel Validator
para executar a validação contra o args
. Existem duas maneiras de adicionar validação a mutações: podemos definir um rules
método e retornar uma matriz contendo as regras para cada argumento, ou definimos as regras diretamente ao definir um argumento. Nós estaremos optando pelo segundo caminho.
Atualize o args
método como abaixo:
// app/GraphQL/Mutation/NewTaskMutation.php
public function args()
{
return [
'title' => [
'name' => 'title',
'type' => Type::nonNull(Type::string()),
'rules' => ['required'],
]
];
}
Adicionamos uma regra que torna o title
argumento necessário.
Agora, vamos criar a mutação para atualizar o status de uma tarefa. Crie um novo UpdateTaskStatusMutation.php
arquivo dentro app/GraphQL/Mutation
e cole o seguinte código nele:
// app/GraphQL/Mutation/UpdateTaskStatusMutation.php
<?php
namespace App\GraphQL\Mutation;
use GraphQL;
use GraphQL\Type\Definition\Type;
use Folklore\GraphQL\Support\Mutation;
use App\Task;
class UpdateTaskStatusMutation extends Mutation
{
protected $attributes = [
'name' => 'updateTaskStatus'
];
public function type()
{
return GraphQL::type('Task');
}
public function args()
{
return [
'id' => [
'name' => 'id',
'type' => Type::nonNull(Type::int()),
'rules' => ['required'],
],
'status' => [
'name' => 'status',
'type' => Type::nonNull(Type::boolean()),
'rules' => ['required'],
]
];
}
public function resolve($root, $args)
{
$task = Task::find($args['id']);
if (!$task) {
return null;
}
$task->is_completed = $args['status'];
$task->save();
return $task;
}
}
Isso é bastante semelhante ao NewTaskMutation
. Ele aceita dois argumentos: o ID da tarefa a ser atualizada e o status da tarefa. O resolve
método obtém a tarefa com o ID fornecido do banco de dados. Se não houver tarefa com o ID fornecido, simplesmente retornaremos null
. Caso contrário, atualizamos a tarefa com o status fornecido e persistimos no banco de dados. Finalmente, retornamos a atualização da tarefa.
Para finalizar as mutações, vamos adicioná-las a config/graphql.php
:
// config/graphql.php
'schemas' => [
'default' => [
// ...
'mutation' => [
'newTask' => \App\GraphQL\Mutation\NewTaskMutation::class,
'updateTaskStatus' => \App\GraphQL\Mutation\UpdateTaskStatusMutation::class,
]
]
],
Testando com o GraphiQL
Até agora, criamos um servidor GraphQL com uma consulta e duas mutações. Vamos agora ver como testamos o servidor usando o GraphiQL. Lembre-se que quando publicamos os arquivos de pacotes laravel-graphql,resources/views/vendor/graphql/graphiql.php
também foi criado um. Isso nos permitirá testar nosso servidor GraphQL em nosso aplicativo Laravel.
Baixe o aplicativo com o comando abaixo:
$ php artisan serve
Isso fará com que o aplicativo seja executado e http://127.0.0.1:8000
, em seguida, visite http://127.0.0.1:8000/graphiql em seu navegador. O GraphiQL deve agora estar rodando como na imagem abaixo:
Podemos ver nosso servidor GraphQL em ação:
Conclusão
Neste tutorial, vimos como usar o GraphQL em um aplicativo do Laravel. Nós apenas arranhamos a superfície do trabalho com o GraphQL nos aplicativos do Laravel. No meu próximo tutorial, vamos nos aprofundar mais, pois vamos construir uma API com o GraphQL e o Laravel. Então fique ligado. O código completo deste tutorial está disponível no GitHub . Fonte: https://blog.pusher.com/graphql-laravel/
0
Donate to Site
About Author
Renato
Developer
Add a Comment
Comments 0 Comments
No comments yet! Be the first to comment
Blog Search
Categories
OUTROS (16)
Variados (109)
PHP (133)
Laravel (171)
Black Hat (3)
front-end (29)
linux (114)
postgresql (39)
Docker (28)
rest (5)
soap (1)
webservice (6)
October (1)
CMS (2)
node (7)
backend (13)
ubuntu (56)
devops (25)
nodejs (5)
npm (3)
nvm (1)
git (8)
firefox (1)
react (7)
reactnative (5)
collections (1)
javascript (7)
reactjs (8)
yarn (0)
adb (1)
Solid (2)
blade (3)
models (1)
controllers (0)
log (1)
html (2)
hardware (3)
aws (14)
Transcribe (2)
transcription (1)
google (4)
ibm (1)
nuance (1)
PHP Swoole (5)
mysql (31)
macox (4)
flutter (1)
symfony (1)
cor (1)
colors (2)
homeOffice (2)
jobs (3)
imagick (2)
ec2 (1)
sw (1)
websocket (2)
markdown (1)
ckeditor (1)
tecnologia (14)
faceapp (1)
eloquent (14)
query (4)
sql (40)
ddd (3)
nginx (9)
apache (4)
certbot (1)
lets-encrypt (3)
debian (12)
liquid (1)
magento (2)
ruby (1)
LETSENCRYPT (1)
Fibonacci (1)
wine (1)
transaction (1)
pendrive (1)
boot (1)
usb (1)
prf (1)
policia (2)
federal (1)
lucena (1)
mongodb (4)
paypal (1)
payment (1)
zend (1)
vim (4)
ciencia (6)
js (1)
nosql (1)
java (1)
JasperReports (1)
phpjasper (1)
covid19 (1)
saude (1)
athena (1)
cinnamon (1)
phpunit (2)
binaural (1)
mysqli (3)
database (42)
windows (6)
vala (1)
json (2)
oracle (1)
mariadb (4)
dev (12)
webdev (24)
s3 (4)
storage (1)
kitematic (1)
gnome (2)
web (2)
intel (3)
piada (1)
cron (2)
dba (18)
lumen (1)
ffmpeg (2)
android (2)
aplicativo (1)
fedora (2)
shell (4)
bash (3)
script (3)
lider (1)
htm (1)
csv (1)
dropbox (1)
db (3)
combustivel (2)
haru (1)
presenter (1)
gasolina (1)
MeioAmbiente (1)
Grunt (1)
biologia (1)
programming (22)
performance (3)
brain (1)
smartphones (1)
telefonia (1)
privacidade (1)
opensource (3)
microg (1)
iode (1)
ssh (3)
zsh (2)
terminal (3)
dracula (1)
spaceship (1)
mac (2)
idiomas (1)
laptop (2)
developer (37)
api (5)
data (1)
matematica (1)
seguranca (2)
100DaysOfCode (9)
hotfix (1)
documentation (1)
laravelphp (10)
RabbitMQ (3)
Elasticsearch (1)
redis (2)
Raspberry (4)
Padrao de design (4)
JQuery (1)
angularjs (4)
Dicas (43)
Kubernetes (3)
vscode (2)
backup (1)
angular (3)
servers (2)
pipelines (1)
AppSec (1)
DevSecOps (4)
rust (1)
RustLang (1)
Mozilla (1)
algoritimo (1)
sqlite (1)
Passport (2)
jwt (5)
security (2)
translate (1)
kube (2)
iot (1)
politica (2)
bolsonaro (1)
flow (1)
podcast (1)
Brasil (1)
containers (3)
traefik (1)
networking (1)
host (1)
POO (2)
microservices (2)
bug (1)
cqrs (1)
arquitetura (3)
Architecture (4)
sail (3)
militar (1)
artigo (1)
economia (1)
forcas armadas (1)
ffaa (1)
autenticacao (2)
autorizacao (2)
authentication (4)
authorization (3)
NoCookies (1)
wsl (4)
memcached (1)
macos (2)
unix (2)
kali-linux (1)
linux-tools (5)
apple (1)
noticias (2)
composer (1)
rancher (1)
k8s (1)
escopos (1)
orm (1)
jenkins (4)
github (5)
gitlab (3)
queue (1)
Passwordless (1)
sonarqube (1)
phpswoole (1)
laraveloctane (1)
Swoole (1)
Swoole (1)
octane (1)
Structurizr (1)
Diagramas (1)
c4 (1)
c4-models (1)
compactar (1)
compression (1)
messaging (1)
restfull (1)
eventdrive (1)
services (1)
http (1)
Monolith (1)
microservice (1)
historia (1)
educacao (1)
cavalotroia (1)
OOD (0)
odd (1)
chatgpt (1)
openai (3)
vicuna (1)
llama (1)
gpt (1)
transformers (1)
pytorch (1)
tensorflow (1)
akitando (1)
ia (1)
nvidia (1)
agi (1)
guard (1)
multiple_authen (2)
rpi (1)
auth (1)
auth (1)
livros (2)
ElonMusk (2)
Oh My Zsh (1)
Manjaro (1)
BigLinux (2)
ArchLinux (1)
Migration (1)
Error (1)
Monitor (1)
Filament (1)
LaravelFilament (1)
replication (1)
phpfpm (1)
cache (1)
vpn (1)
l2tp (1)
zorin-os (1)
optimization (1)
scheduling (1)
monitoring (2)
linkedin (1)
community (1)
inteligencia-artificial (2)
wsl2 (1)
maps (1)
API_KEY_GOOGLE_MAPS (1)
repmgr (1)
altadisponibilidade (1)
banco (1)
modelagemdedados (1)
inteligenciadedados (4)
governancadedados (1)
bancodedados (2)
Observability (1)
picpay (1)
ecommerce (1)
Curisidades (1)
Samurai (1)
KubeCon (1)
GitOps (1)
Axios (1)
Fetch (1)
Deepin (1)
vue (4)
nuxt (1)
PKCE (1)
Oauth2 (2)
webhook (1)
TypeScript (1)
tailwind (1)
gource (2)