Banco de Dados no Módulo
Como configurar conexões, criar migrations e seeders no seu módulo.
Seleção de banco (connection.php)
Cada módulo declara qual banco usa em Database/connection.php:
<?php
// Opções: 'core' | 'modules' | 'auto'
return 'core';
| Valor | Banco usado | Variáveis .env |
|---|---|---|
'core' | Banco principal | DB_HOST, DB_NOME, DB_USUARIO, DB_SENHA |
'modules' | Banco secundário | DB2_HOST, DB2_NOME, DB2_USUARIO, DB2_SENHA |
'auto' | Detecta automaticamente | Usa DB2 se configurado, senão DB |
Migrations
Migrations criam e removem tabelas. Devem ter funções up e down e verificar o driver do banco:
<?php
use PDO;
return [
'up' => function (PDO $pdo): void {
$driver = $pdo->getAttribute(PDO::ATTR_DRIVER_NAME);
if ($driver === 'pgsql') {
$pdo->exec("CREATE TABLE IF NOT EXISTS produtos (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
nome VARCHAR(255) NOT NULL,
preco DECIMAL(10,2) NOT NULL DEFAULT 0,
criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW()
)");
} else {
$pdo->exec("CREATE TABLE IF NOT EXISTS produtos (
id CHAR(36) PRIMARY KEY,
nome VARCHAR(255) NOT NULL,
preco DECIMAL(10,2) NOT NULL DEFAULT 0,
criado_em DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
}
},
'down' => function (PDO $pdo): void {
$pdo->exec("DROP TABLE IF EXISTS produtos");
},
];
Seeders
Seeders inserem dados iniciais. São executados automaticamente após o deploy:
<?php
use PDO;
return function (PDO $pdo): void {
$driver = $pdo->getAttribute(PDO::ATTR_DRIVER_NAME);
$id = $driver === 'pgsql'
? $pdo->query('SELECT gen_random_uuid()')->fetchColumn()
: bin2hex(random_bytes(16));
$pdo->prepare("INSERT INTO produtos (id, nome, preco) VALUES (?, ?, ?)")
->execute([$id, 'Produto Exemplo', 99.90]);
};
Ao publicar o módulo em src/Modules/, as migrations e seeders são executados automaticamente. Ao excluir o projeto, as tabelas são removidas automaticamente via down().
Injeção de PDO no Repository
O container injeta o PDO automaticamente via constructor injection:
final class ProdutoRepository
{
// PDO é injetado automaticamente pelo container
public function __construct(private readonly PDO $pdo) {}
public function findAll(): array
{
return $this->pdo
->query("SELECT * FROM produtos ORDER BY criado_em DESC")
->fetchAll(PDO::FETCH_ASSOC);
}
}
Banco de Dados Personalizado
A IDE permite configurar uma conexão de banco de dados personalizada para isolar seus módulos de desenvolvimento do banco core da aplicação.
Por que usar?
Isolamento de Dados
Seus módulos não compartilham o mesmo banco que o sistema core. Dados de desenvolvimento ficam separados.
Flexibilidade
Use PostgreSQL enquanto o core usa MySQL (ou vice-versa). Conecte-se a bancos em nuvem (Aiven, AWS RDS, etc.).
Segurança
Credenciais criptografadas com AES-256-CBC. Suporte a SSL/TLS com certificados CA.
Como configurar
Acessar a página de projetos
Na página /dashboard/ide, localize o card "Conexão de Banco de Dados".
Clicar em "Configurar Banco de Dados"
Preencha os campos obrigatórios:
- Nome da conexão: Nome amigável (ex: "Meu PostgreSQL Local")
- Driver: PostgreSQL ou MySQL
- Nome do banco: Nome do database (ex:
meu_banco_dev) - Host: Endereço do servidor (ex:
localhostoupg-xxx.aivencloud.com) - Porta: Porta do banco (ex:
5432para PostgreSQL,3306para MySQL) - Usuário: Nome de usuário do banco
- Senha: Senha do banco de dados
Configurar SSL (opcional)
Para conexões em produção ou com bancos em nuvem:
- Modo SSL: Nenhum, Require, Verify CA ou Verify Full
- Certificado CA: Cole o conteúdo do arquivo
.pem(necessário para Verify CA/Full)
Testar e Conectar
Clique em "Testar Conexão" para validar. Se bem-sucedido, clique em "Conectar" para salvar.
Exemplo: PostgreSQL no Aiven
Nome da conexão: Aiven PostgreSQL
Driver: PostgreSQL
Nome do banco: defaultdb
Host: pg-xxx-yyy.aivencloud.com
Porta: 12345
Usuário: avnadmin
Senha: sua_senha_aiven
Modo SSL: Require
Certificado CA: (cole o conteúdo do ca.pem fornecido pelo Aiven)
Comportamento do sistema
| Tipo de Módulo | Banco Usado |
|---|---|
| Nativos (Auth, Usuario, etc.) | Banco Core (DB_*) |
| Desenvolvedor (seus módulos) | Banco Personalizado (se configurado) |
O sistema usa conexões persistentes (PDO::ATTR_PERSISTENT) para melhor performance. Primeira requisição: ~3500ms (estabelece conexão). Requisições subsequentes: ~50-200ms (reutiliza conexão) — 95% mais rápido!
Gerenciamento
No card de banco de dados, você pode:
- Ver/Ocultar dados: Clique no ícone de olho para mostrar/ocultar host, porta e nome do banco
- Ver migrations pendentes: Número de migrations que ainda não foram executadas
- Ver tabelas: Lista de todas as tabelas criadas no banco personalizado
- Editar conexão: Modifique as configurações (senha é mantida se deixar vazio)
- Excluir conexão: Remove a configuração (seus módulos voltam a usar o banco core)
Ao excluir a conexão, seus módulos voltarão a usar o banco de dados padrão da Vupi.us API. As tabelas e dados no banco personalizado não serão afetados.
Segurança
- Criptografia: Senhas são criptografadas com AES-256-CBC antes de serem armazenadas
- SSL/TLS: Suporte completo a conexões seguras com verificação de certificado
- Isolamento: Cada usuário tem sua própria configuração de conexão
Para mais detalhes, consulte a documentação completa de configuração de banco de dados personalizado.