Ir para o conteúdo
TubePress — gratuito, auto-hospedado & ativamente mantido
Referência para desenvolvedores

Arquitetura

A estrutura do core, o ciclo de vida da requisição e as convenções sem framework que o TubePress segue.

O TubePress é um software deliberadamente simples. Não há framework, container de injeção de dependências nem etapa de build — apenas PHP moderno e bem organizado usando classes estáticas. Esta página explica como as peças se encaixam para que você possa estender o CMS com confiança e saber exatamente onde seu código pertence.

Filosofia de design

Três ideias moldam todo o código-fonte:

  • Sem framework. PHP puro com classes estáticas personalizadas. Não há dependências de tempo de execução do Composer para quebrar e nada para aprender além do próprio PHP.
  • Um núcleo fixo, complementos livres. O núcleo é atualizável e nunca deve ser editado diretamente. Tudo que você personaliza vive em temas, plugins ou configurações.
  • Construído para escalar e sobreviver a hospedagens baratas. Tarefas pesadas são divididas em partes, e um pseudo-cron embutido significa que nenhum crontab de sistema é necessário.

Estrutura de diretórios

O repositório separa o núcleo (fixo, atualizável) dos complementos (instalados e removidos pelos usuários).

CORE — never modified by themes/plugins, replaced by updates
  config/            App config, DB config, install marker
  src/Core/          App, Database, Router, Pagination, CronManager,
                     and the managers (Seo, Transcode, Update, …)
  src/Auth/          Auth, Gate (permissions)
  src/Models/        Video, Category, Tag, Performer, Channel,
                     Comment, Page, User, Setting, Favorite, History
  src/Admin/         Admin CRUD controllers
  src/Front/         Public-facing controllers
  src/Install/       InstallController, Migrator
  src/Helpers/       Format, FileUpload, Sanitizer, Slug, SEO,
                     Player, RateLimiter, ImpressionTracker
  src/Plugin/        HookSystem, PluginInterface, PluginManager
  src/Theme/         ThemeManager, ThemeRenderer
  sql/               Numbered migrations (001_…sql → 0xx_…sql)
  templates/admin/   Admin panel templates (layout + partials)
  templates/install/ Install wizard templates
  public/            Web root — index.php, uploads/, symlinks
  cron/              Optional CLI scripts for a system crontab

ADD-ONS — installable / removable by users
  themes/            Theme directories (active: "simply")
  plugins/           Plugin directories (agegate, backup, ctr)
  lang/              Translation files (en, fr, de, es, ar, …)
Nunca edite o núcleo para personalizar. Qualquer coisa em src/, config/, sql/ ou templates/ pode ser substituída por uma atualização. Coloque suas alterações em um tema ou plugin para que elas sobrevivam.

O ciclo de vida da requisição

Toda requisição flui por public/index.php na mesma ordem:

  1. Verificação de versão PHP. config/php-guard.php é executado primeiro — uma porta segura que impede a inicialização em uma versão PHP não suportada antes que qualquer sintaxe moderna seja carregada.
  2. Bootstrap. config/app.php configura o autoloading, a sessão e os serviços principais.
  3. Verificação de instalação. Se App::isInstalled() for false (sem config/installed.php), a requisição é roteada para o assistente de instalação e mais nada é carregado.
  4. Registro de rotas. Os controllers de admin, API e front registram suas rotas por meio de um método estático ::routes().
  5. Despacho. Router::dispatch() combina a URL e chama o método do controller.
  6. Renderização. As ações de admin renderizam templates/admin/*; as ações de front renderizam o tema ativo por meio de ThemeRenderer::render().
  7. Trabalho pós-renderização. As impressões são enviadas e CronManager::run() dispara as tarefas pendentes.

As rotas de página frontal (o catch-all /{slug} para páginas estáticas) são registradas por último, para que nunca ofusquem rotas reais.

Convenções do núcleo

ConceitoConvenção
ControllersAdminXxxController::routes() / FrontXxxController::routes() registram rotas; os métodos tratam as requisições.
ModelsMétodos estáticos: Video::find($id), Video::all($filters), Video::create($data).
DatabaseDatabase::fetchOne(), fetchAll(), insert(), update(), delete(), count(), transaction().
RouterRouter::get(), Router::post(), Router::param('name'), Router::redirect().
Templates de adminRouter::render('admin/videos', […])templates/admin/videos.php (carrega layout.php + um partial _videos.php).
Templates de frontThemeRenderer::render('home', […]) → template do tema ativo + seu layout.php.
Migrationssql/NNN_name.sql, executado automaticamente por Migrator::run() durante a instalação e atualização.
HooksHookSystem::doAction('event') e HookSystem::applyFilter('filter', $value).

Suporte a servidor web

O TubePress roda tanto em Apache quanto em Nginx:

  • Apache — os arquivos .htaccess tratam a reescrita de URL e a proteção de diretórios.
  • Nginx — as diretivas alias servem os assets e as regras deny all protegem caminhos sensíveis.
  • Symlinkspublic/themes → ../../themes e public/templates → ../../templates expõem os assets de tema e admin mantendo o código-fonte PHP fora da raiz web.

A raiz web é sempre public/. Tudo que é sensível — config/, src/, sql/, storage/ — fica fora dela e é adicionalmente bloqueado no nível do servidor.

O que personalizar

Você quer…Faça em…
Alterar aparência e layoutUm tema (ou configurações de Aparência para alterações sem código)
Adicionar um recurso ou integraçãoUm plugin usando ações e filtros
Alterar comportamento sem códigoConfigurações
Adicionar trabalho agendadoO CronManager, a partir de um plugin

Próximos passos

Ainda com dúvidas?

Abra um ticket pelo painel e nossa equipe vai ajudá-lo.

Experimente o demo ao vivo → Baixar TubePress →