Crie um servidor PHP + API Rest + GraphQL
Tags: php, symfony, laravel, graphql
Published: 2022-06-28 19:36:50

---
title: Crie um servidor PHP + API Rest + GraphQL 
published: true
description: Vamos construir um servidor GraphQL + RestFull escrito em ApiPlatform.
tags: #php #symfony #laravel #graphql 
# cover_image: https://direct_url_to_image.jpg
# Use a ratio of 100:42 for best results.
---

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

```bash
$ cd ~/
$ mkdir wedding
$ cd wedding
```

Com isso seu projeto Symfony será criado, execute passo a passo.

```bash
$ 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

```bash
$ docker-compose up -d
```

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

```bash
$ composer require --dev symfony/maker-bundle
```
Entidade `Couple`, em seu terminal digite:
```bash
$ php bin/console make:entity Couple
manName: <string:255> not null
womanName: <string:255> not null
```
Siga com os nomes como no print:
![Entity Couple](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eq3bysmgpnifo20xe7kj.png)
Entidade `Event`, em seu terminal digite: 
```bash
$ 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
```bash
$ php bin/console make:entity Couple
```
![Relation with events](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jplpst0o1kqa0aszgcym.png)
 

No mapeamento da classe Event você precisará ajustar na mão o relacionamento, deve ficar assim:

```php

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

```bash
$ 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

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

```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](http://localhost:7777/api) - Swagger documentation RESTAPI

Acesse: [http://localhost:7777/api/graphql](http://localhost:7777/api) - Playground GraphQL 

Veja algumas queries que você pode fazer em GraphQL:

Para criar um novo casal faça isso:

```graphql
mutation CretateCouple($couple: createCoupleInput! ) {
  createCouple(input: $couple) {
    couple {
      manName
      womanName
    }
  }
}
#query variables
{
  "couple":{
    "manName": "joe",
    "womanName": "mary"
  }
}

```

Para buscar todos:

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

### Referências:
[Symfony](https://symfony.com/doc/current/setup.html)
[ApiPlatform](https://api-platform.com/docs/distribution/)
[Symfony Maker](https://symfony.com/bundles/SymfonyMakerBundle/current/index.html)