🔄 Ciclo de Vida da Requisição
Toda Requisição Começa em index.php
- Definir constantes (
ROOT,APP,CONFIG) - Carregar funções auxiliares
- Verificar se está instalado (o arquivo
config/database.phpexiste?) - Se não estiver instalado → redirecionar para
/install/ - Carregar configuração do BD + helpers, iniciar sessão
- Calcular o caminho da requisição (trata instalações em subdiretórios)
- Despachar via
app/router.php
O Router
app/router.php é uma tabela de despacho plana com correspondência de padrões. Os padrões são compilados em regex e comparados com o caminho da requisição. Os grupos de captura são passados como argumentos do método do controller.
Autenticação
A maioria dos controllers chama require_auth(), que redireciona usuários não autenticados para /login. Endpoints exclusivos para administradores usam require_admin(), que retorna JSON 403.
As sessões são preenchidas no login com user_id, workspace_id, role e regeneradas para prevenir fixação de sessão.
Conexão com o Banco de Dados
A conexão PDO é criada de forma lazy na primeira consulta (singleton). Usa ERRMODE_EXCEPTION e prepared statements reais (EMULATE_PREPARES = false).
Formatos de Resposta
- Páginas HTML: O controller define
$pagee incluilayout.php - APIs JSON:
json_response()define o Content-Type, imprime JSON e encerra - Stream SSE: Loop persistente com
text/event-stream, ping a cada 2s, encerra após 55s