Crie um servidor PHP + API Rest + GraphQL

jefersonguedes

Jeferson Guedes

Posted on June 28, 2022

Crie um servidor PHP + API Rest + GraphQL

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Suba seu container com banco de dados configurado

$ docker-compose up -d
Enter fullscreen mode Exit fullscreen mode

Agora vamos criar nossas entidades, mas antes precisamos criar uma dependência de desenvolvimento

$ composer require --dev symfony/maker-bundle
Enter fullscreen mode Exit fullscreen mode

Entidade Couple, em seu terminal digite:

$ php bin/console make:entity Couple
manName: <string:255> not null
womanName: <string:255> not null
Enter fullscreen mode Exit fullscreen mode

Siga com os nomes como no print:
Entity Couple
Entidade Event, em seu terminal digite:

$ php bin/console make:entity Event
name: <string:255> not null
price: <float> not null
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Relation with events

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;
    ...
}
Enter fullscreen mode Exit fullscreen mode

Vamos gerar nossa migrações, no seu e subir a estrutura de SQL.

$ php bin/console make:migration
$ php bin/console doctrine:migration:migrate
Enter fullscreen mode Exit fullscreen mode

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;
        ...
Enter fullscreen mode Exit fullscreen mode

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
...
Enter fullscreen mode Exit fullscreen mode

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"
  }
}

Enter fullscreen mode Exit fullscreen mode

Para buscar todos:

query {
  couples {
    edges {
      node {
        manName
        womanName
      }
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

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.

Referências:

Symfony
ApiPlatform
Symfony Maker

💖 💪 🙅 🚩
jefersonguedes
Jeferson Guedes

Posted on June 28, 2022

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related