@extends('layouts.docs') @section('title', 'Bootstrap - OG Framework') @section('body')
Arquitetura
O OG Framework utiliza um sistema híbrido de bootstrap que suporta múltiplos pontos de entrada — web, AJAX, CLI e cron — cada um com seu próprio fluxo otimizado mas compartilhando componentes comuns.
O sistema escolhe automaticamente o bootstrapper correto baseado no contexto de execução:
index.php
Controlador frontal HTTP. Bootstrap completo com autenticação e views.
AjaxServer.php
AJAX otimizado com DEFERRED_INIT — carrega BD só quando necessário.
./og
CLI Symfony Console. Boot mínimo ou completo conforme comando.
cron.php
Tarefas agendadas. Memory/time unlimited, multi-tenant.
download.php
Streaming de arquivos com controle de acesso.
upload.php
Imagens com transformações (watermark, resize).
O bootstrap web é o mais completo, passando por todas as fases de inicialização:
O ApplicationBootstrapper divide a inicialização em duas fases distintas:
init_1() — Fase de Segurança
sanitizeInputVars() — Escapa inputs maliciososloadRebranding() — White-label configscheckDefinedVars() — Valida paths essenciaisload_config() — Carrega config.phpset_php_settings() — Timezone, locale, error levelspl_autoload_register() — Autoloader legacyinit_2() — Fase de Dados
databaseConnect() — Conexão MySQL (crítico)initialize_redis() — Client RedisloadRequiredModules() — Módulos coreloadLanguage() — i18n baseado em sessãoloadModules() — Todos os módulos ativosload_addons() — Plugins de terceiros
O CLI usa o CliBootstrapper com três níveis de inicialização conforme a complexidade do comando:
Métodos do CliBootstrapper
boot()
Inicialização básica. Carrega configs, não conecta ao BD ainda.
ensureDatabaseConnection()
Conecta ao BD sob demanda. Flag evita reconexão.
end()
Cleanup. Fecha conexões, limpa estado.
// Exemplo: Comando que precisa de BD
class MigrateCommand extends Command
{
protected function execute(InputInterface $input, OutputInterface $output): int
{
// O CliBootstrapper já garantiu a conexão!
$db = app('database');
// Executa migrations
$migrator = app(Migrator::class);
$migrator->run();
return Command::SUCCESS;
}
}
O AJAX usa inicialização diferida — a fase init_2() só executa quando realmente necessário:
Por que DEFERRED_INIT?
Muitas chamadas AJAX não precisam de conexão ao BD (ex: validação de formulários, cálculos client-side). O DEFERRED_INIT economiza ~50ms por request ao pular a inicialização do banco de dados até que seja realmente necessário.
| Aspecto | ApplicationBootstrapper | CliBootstrapper |
|---|---|---|
| Contexto | HTTP/Web | Terminal/CLI |
| Fases | init_1() + init_2() |
boot() + ensureDatabaseConnection() + end() |
| Sessão | ✅ session_start() | ❌ Não aplicável |
| Sanitização | ✅ GET/POST/REQUEST | ❌ Mínima |
| BD | Sempre em init_2() | Sob demanda via flag |
| Controle de estado | Sem flags | isBooted, isDatabaseConnected |
O arquivo bootstrap.php é o ponto central que configura o container DI:
// bootstrap.php
ErrorHandler::register(); // Error handling global
Dotenv::createImmutable(rootPath())->safeLoad(); // Variáveis .env
$container = Container::getInstance(); // Singleton do container
// Seleciona bootstrapper baseado no contexto
if (isCli()) {
$container->make(CliBootstrapper::class);
} else {
$container->make(ApplicationBootstrapper::class);
}
$container->boot(); // Carrega todos os Service Providers
return $container;
16 Service Providers Registrados
EventServiceProvider
HelperServiceProvider
ConfigServiceProvider
QueueServiceProvider
RedisServiceProvider
CacheServiceProvider
HttpClientServiceProvider
ValidationServiceProvider
GlobalServiceProvider
ViewServiceProvider
NotificationServiceProvider
RoutingServiceProvider
GuardServiceProvider
QueueMasterServiceProvider
SaftPtServiceProvider
SaftAoServiceProvider