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