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
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 Occasion
, em seu terminal digite:
$ php bin/console make:entity Occasion
identify: <string:255> not null
value: <float> not null
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
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;
...
}
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 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;
...
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
...
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"
}
}
Para buscar todos:
question {
{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.