Contextualização:
Vamos construir um servidor GraphQL + RestFull escrito em ApiPlatform, este projeto irá te ajudar a entender um sobre a facilidade de construir uma API Rest e GraphQL no mesmo projeto.
Para este tutorial eu desenvolvi uma lista de itens a serem pagos para um planejamento de casamento.
A ideia deste projeto é bem simples casal tem 0::N eventos cada evento tem um nome e valor.
Bom, chega de conversa e vamos para o código:
Pré requisitos:
- Docker + Docker Compose
- PHP 8.1
- Composer
Instalação:
Abra um terminal e crie um diretório onde você deseja que seu código fique em seu computador.
$ cd ~/
$ mkdir wedding
$ cd wedding
Com isso seu projeto Symfony será criado, execute passo a passo.
$ composer create-project symfony/skeleton:"6.1.*" .
$ composer req orm # y para criar o docker-compose.yml
$ composer req api
$ composer require webonyx/graphql-php
Suba seu container com banco de dados configurado
$ docker-compose up -d
Agora vamos criar nossas entidades, mas antes precisamos criar uma dependência de desenvolvimento
$ composer require --dev symfony/maker-bundle
Entidade Couple
, em seu terminal digite:
$ php bin/console make:entity Couple
manName: <string:255> not null
womanName: <string:255> not null
Siga com os nomes como no print:
Entidade Event
, em seu terminal digite:
$ php bin/console make:entity Event
name: <string:255> not null
price: <float> not null
Vamos voltar para a criação de entidade, mas vamos só criar uma relação 0::N de Couple com Events
$ php bin/console make:entity Couple
No mapeamento da classe Event você precisará ajustar na mão o relacionamento, deve ficar assim:
#src/Entity/Event.php
class Event
{
...
#[ORM\ManyToOne(targetEntity: Couple::class)]
#[ORM\JoinColumn(name: "couple_id", referencedColumnName: "id", nullable: true)]
private $couple;
...
}
Vamos gerar nossa migrações, no seu e subir a estrutura de SQL.
$ php bin/console make:migration
$ php bin/console doctrine:migration:migrate
Pressione yes
para apagar todos os dados do banco de app
Configuração
Vamos partir de agora mexer somente nas entidades.
1.) Importar Attribute ApiResource em sua classe src/Entity/Event.php
namespace App\Entity;
use ApiPlatform\Core\Annotation\ApiResource;
use App\Repository\EventRepository;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity(repositoryClass: EventRepository::class)]
#[ApiResource]
class Event
{
...
#[ORM\ManyToOne(targetEntity: Couple::class)]
#[ORM\JoinColumn(name: "couple_id", referencedColumnName: "id", nullable: true)]
#[ApiSubresource]
private $couple;
...
2.) Importar Attribute ApiResource em sua classe src/Entity/Couple.php
namespace App\Entity;
use ApiPlatform\Core\Annotation\ApiResource;
use App\Repository\CoupleRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity(repositoryClass: CoupleRepository::class)]
#[ApiResource]
class Couple
...
Execute:
Rode seu servidor local php para ter acesso ao localhost
Acesse: http://localhost:7777/api - Swagger documentation RESTAPI
Acesse: http://localhost:7777/api/graphql - Playground GraphQL
Veja algumas queries que você pode fazer em GraphQL:
Para criar um novo casal faça isso:
mutation CretateCouple($couple: createCoupleInput! ) {
createCouple(input: $couple) {
couple {
manName
womanName
}
}
}
#query variables
{
"couple":{
"manName": "joe",
"womanName": "mary"
}
}
Para buscar todos:
query {
couples {
edges {
node {
manName
womanName
}
}
}
}
Conclusão
Espero que tenham gostado fiz um exemplo bem simples para ajudar a entender mais sobre essas ferramentas tão maravilhosas que nem sempre temos contato.
Top comments (1)
Conteúdo de alto nível. Parabéns meu mano. Continue...