@extends('layouts.docs') @section('title', 'Bootstrap - OG Framework') @section('body')
{{-- Left Sidebar: Navigation --}} @include('docs.partials.sidebar') {{-- Main Content --}}
{{-- Page Header --}}
Voltar para Documentação

Arquitetura

Sistema de Bootstrap

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.

{{-- Entry Points Overview --}}

Pontos de Entrada

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).

{{-- FLOW: HTTP/Web --}}

Fluxo HTTP/Web Completo

O bootstrap web é o mais completo, passando por todas as fases de inicialização:

1. Requisição HTTP 2. .htaccess → index.php 3. index.php require '_files/init.php' 4. init.php $app = require 'bootstrap.php' → Container DI new ApplicationBootstrapper() init_1() Segurança init_2() Database/Redis Hooks: init_1 → init_2 Routing → Controller → Response Request Entry Point Bootstrap Fases Response
{{-- init_1 vs init_2 --}}

Fases de Inicialização

O ApplicationBootstrapper divide a inicialização em duas fases distintas:

init_1() — Fase de Segurança

  • sanitizeInputVars() — Escapa inputs maliciosos
  • loadRebranding() — White-label configs
  • checkDefinedVars() — Valida paths essenciais
  • load_config() — Carrega config.php
  • set_php_settings() — Timezone, locale, error level
  • spl_autoload_register() — Autoloader legacy

init_2() — Fase de Dados

  • databaseConnect() — Conexão MySQL (crítico)
  • initialize_redis() — Client Redis
  • loadRequiredModules() — Módulos core
  • loadLanguage() — i18n baseado em sessão
  • loadModules() — Todos os módulos ativos
  • load_addons() — Plugins de terceiros
{{-- FLOW: CLI --}}

Fluxo CLI (./og)

O CLI usa o CliBootstrapper com três níveis de inicialização conforme a complexidade do comando:

./og <comando> Setup Inicial • SAPI Validation (cli) • require 'vendor/autoload.php' • Dotenv::safeLoad() Tipo de Comando? (precisa contexto?) Simples (sem BD/app) • Container::getInstance() • $container→boot() • CLIApplication→run() Complexo (load full app) • require 'bootstrap.php' • ensureDatabaseConnection() • $cli→boot() • $cli→end() • CLIApplication→run()
{{-- CliBootstrapper methods --}}

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.

{{-- CLI Code Example --}}
// 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;
    }
}
{{-- FLOW: AJAX --}}

Fluxo AJAX (AjaxServer.php)

O AJAX usa inicialização diferida — a fase init_2() só executa quando realmente necessário:

POST /ajaxserver/action AjaxServer.php define('DEFERRED_INIT', true) $OG_Init→init_1() Only Parse Action Name Precisa BD? (AjaxRegistry) Run init_2() Skip init_2 (Fast path) new AjaxServer($action) $this->$action()

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.

{{-- Bootstrap Comparison Table --}}

Comparativo de Bootstrappers

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
{{-- Container & Service Providers --}}

Container & Service Providers

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;
{{-- Service Providers List --}}

16 Service Providers Registrados

EventServiceProvider HelperServiceProvider ConfigServiceProvider QueueServiceProvider RedisServiceProvider CacheServiceProvider HttpClientServiceProvider ValidationServiceProvider GlobalServiceProvider ViewServiceProvider NotificationServiceProvider RoutingServiceProvider GuardServiceProvider QueueMasterServiceProvider SaftPtServiceProvider SaftAoServiceProvider
{{-- Navigation --}}
{{-- Right Sidebar: Table of Contents --}} @include('docs.partials.toc', ['sections' => [ 'pontos-de-entrada' => 'Pontos de Entrada', 'fluxo-http' => 'Fluxo HTTP/Web', 'fases-inicializacao' => 'Fases de Inicialização', 'fluxo-cli' => 'Fluxo CLI', 'fluxo-ajax' => 'Fluxo AJAX', 'comparativo' => 'Comparativo', 'service-providers' => 'Service Providers', ]])
@endsection