API REST em Symfony para gerenciamento de contas e transações financeiras: criação de contas, depósito, saque e transferência, com validações de negócio, persistência via Doctrine ORM (MySQL) e testes automatizados.
- PHP 8.2+
- Composer 2+
- MySQL 8.0+ (já configurado no seu ambiente)
- Extensões PHP: pdo_mysql, intl, zip
- Symfony Framework
- Doctrine ORM (MySQL)
- PHPUnit (testes)
src/Controller/
: Controllers HTTP (rotas)src/Service/
: Regras de negócio (serviços)src/Entity/
: Entidades Doctrinesrc/Repository/
: Repositórios Doctrineconfig/
: Configurações Symfony/Doctrinemigrations/
: Migrations do Doctrinetests/
: Testes automatizadospublic/
: Document root (index.php)
- Instale dependências PHP
composer install
- Configure variáveis de ambiente
Crie um arquivo
.env.local
na raiz do projeto com a URL do seu MySQL (ajuste USUARIO, SENHA e BASE):
APP_ENV=dev
APP_DEBUG=1
DATABASE_URL="mysql://USUARIO:SENHA@127.0.0.1:3306/BASE?serverVersion=8.0&charset=utf8mb4"
- Crie o banco e rode as migrations
php bin/console doctrine:database:create --if-not-exists
php bin/console doctrine:migrations:migrate --no-interaction
- Suba o servidor local com Symfony CLI (recomendado)
# foreground
symfony serve --no-tls --port=8084
# ou em background (daemon)
symfony serve -d --no-tls --port=8084
# para parar
symfony local:server:stop --dir=.
Acesse: http://localhost:8084
Observação: um 404 para favicon.ico
no log pode aparecer e é esperado; não afeta a UI.
Todas as rotas aceitam e retornam JSON.
- Método: POST
- URL:
/api/useraccounts
- Body:
{
"user_type": "string",
"full_name": "string",
"document": "apenas dígitos (CPF/CNPJ)",
"email": "email@exemplo.com",
"password": "string"
}
- Respostas: 201 (criada), 400 (validação)
Exemplo cURL:
curl -X POST http://localhost:8084/api/useraccounts \
-H "Content-Type: application/json" \
-d '{
"user_type": "PF",
"full_name": "Fulano de Tal",
"document": "12345678901",
"email": "fulano@example.com",
"password": "senha"
}'
- Método: GET
- URL:
/api/useraccounts/{id}
- Respostas: 200 (ok), 404 (não encontrada)
Exemplo:
curl http://localhost:8084/api/useraccounts/1
- Método: POST
- URL:
/api/deposit
- Body:
{ "accountId": 1, "amount": 100.0 }
- Respostas: 201 (ok), 400 (erro de validação/negócio)
Exemplo:
curl -X POST http://localhost:8084/api/deposit \
-H "Content-Type: application/json" \
-d '{"accountId":1, "amount":100.0}'
- Método: POST
- URL:
/api/takeoutvalue
- Body:
{ "accountId": 1, "amount": 50.0 }
- Respostas: 201 (ok), 400 (erro de validação/negócio)
Exemplo:
curl -X POST http://localhost:8084/api/takeoutvalue \
-H "Content-Type: application/json" \
-d '{"accountId":1, "amount":50.0}'
- Método: POST
- URL:
/api/transfers
- Body:
{
"from_document": "12345678901",
"to_document": "98765432100",
"amount": 100.0
}
- Respostas: 200 (ok), 400/404 (erro de validação/negócio)
Exemplo:
curl -X POST http://localhost:8084/api/transfers \
-H "Content-Type: application/json" \
-d '{
"from_document":"12345678901",
"to_document":"98765432100",
"amount":100
}'
- Método: GET
- URL:
/api/transfers/{document}?page=1&limit=10
- Query params:
page
(padrão 1),limit
(padrão 10, máx. 50)
Exemplo:
curl "http://localhost:8084/api/transfers/12345678901?page=1&limit=10"
- Documento do remetente/destinatário deve conter apenas dígitos.
- Remetente com CNPJ (14 dígitos) não pode realizar transferência.
- Valor da transferência deve ser maior que 0 e saldo suficiente é obrigatório.
- Há validação externa antes de efetivar a transferência.
- São persistidos os saldos atualizados e a entidade
Transactions
como histórico. - Notificações são enviadas via serviço de notificação (mock por padrão em
var/log/notifications.log
).
Rodar a suíte:
vendor/bin/phpunit
Arquivo relevante: tests/Service/TransferServiceTest.php
.
Existem Dockerfile
e docker-compose.yml
, mas o uso requer virtualização ativa (BIOS/UEFI), não possuo tal configuração em minha máquina, WSL2 e Docker Desktop. Após atender os requisitos:
docker compose up -d --build
Depois rode as migrations e acesse http://localhost:8084
.
Este projeto usa NelmioApiDocBundle para gerar a documentação da API.
Rota da documentação (Swagger UI):
http://localhost:8084/api/docs
Caso ainda não tenha instalado (já incluso no projeto):
composer require nelmio/api-doc-bundle:^4.22 --no-interaction
Arquivos relevantes:
config/packages/nelmio_api_doc.yaml
: configura título/servidor/áreasconfig/routes.yaml
: registra a rota/api/docs