Tuesday, June 28, 2022
HomeWordPress DevelopmentCrie um servidor PHP + API Relaxation + GraphQL

Crie um servidor PHP + API Relaxation + 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 Relaxation 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 marriage ceremony
$ cd marriage ceremony
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 Occasion, em seu terminal digite:

$ php bin/console make:entity Occasion
identify: <string:255> not null
value: <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 Occasions

$ php bin/console make:entity Couple
Enter fullscreen mode

Exit fullscreen mode

Relation with events

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


#src/Entity/Occasion.php
class Occasion
{
    ...
    #[ORMManyToOne(targetEntity: Couple::class)]
    #[ORMJoinColumn(name: "couple_id", referencedColumnName: "id", nullable: true)]
    non-public $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 sure 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/Occasion.php

namespace AppEntity;

use ApiPlatformCoreAnnotationApiResource;
use AppRepositoryEventRepository;
use DoctrineORMMapping as ORM;

#[ORMEntity(repositoryClass: EventRepository::class)]
#[ApiResource]
class Occasion
{
        ...
        #[ORMManyToOne(targetEntity: Couple::class)]
    #[ORMJoinColumn(name: "couple_id", referencedColumnName: "id", nullable: true)]
    #[ApiSubresource]
    non-public $couple;
        ...
Enter fullscreen mode

Exit fullscreen mode

2.) Importar Attribute ApiResource em sua classe src/Entity/Couple.php

namespace AppEntity;

use ApiPlatformCoreAnnotationApiResource;
use AppRepositoryCoupleRepository;
use DoctrineCommonCollectionsArrayCollection;
use DoctrineCommonCollectionsCollection;
use DoctrineORMMapping as ORM;

#[ORMEntity(repositoryClass: CoupleRepository::class)]
#[ApiResource]
class Couple
...
Enter fullscreen mode

Exit fullscreen mode



Execute:

Rode seu servidor native 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(enter: $couple) {
    couple {
      manName
      womanName
    }
  }
}
#question variables
{
  "couple":{
    "manName": "joe",
    "womanName": "mary"
  }
}

Enter fullscreen mode

Exit fullscreen mode

Para buscar todos:

question {
  {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

RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

- Advertisment -
Google search engine

Most Popular

Recent Comments