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, …)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:
- 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. - Bootstrap.
config/app.phpconfigura o autoloading, a sessão e os serviços principais. - Verificação de instalação. Se
App::isInstalled()for false (semconfig/installed.php), a requisição é roteada para o assistente de instalação e mais nada é carregado. - Registro de rotas. Os controllers de admin, API e front registram suas rotas por meio de um método estático
::routes(). - Despacho.
Router::dispatch()combina a URL e chama o método do controller. - Renderização. As ações de admin renderizam
templates/admin/*; as ações de front renderizam o tema ativo por meio deThemeRenderer::render(). - 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
| Conceito | Convenção |
|---|---|
| Controllers | AdminXxxController::routes() / FrontXxxController::routes() registram rotas; os métodos tratam as requisições. |
| Models | Métodos estáticos: Video::find($id), Video::all($filters), Video::create($data). |
| Database | Database::fetchOne(), fetchAll(), insert(), update(), delete(), count(), transaction(). |
| Router | Router::get(), Router::post(), Router::param('name'), Router::redirect(). |
| Templates de admin | Router::render('admin/videos', […]) → templates/admin/videos.php (carrega layout.php + um partial _videos.php). |
| Templates de front | ThemeRenderer::render('home', […]) → template do tema ativo + seu layout.php. |
| Migrations | sql/NNN_name.sql, executado automaticamente por Migrator::run() durante a instalação e atualização. |
| Hooks | HookSystem::doAction('event') e HookSystem::applyFilter('filter', $value). |
Suporte a servidor web
O TubePress roda tanto em Apache quanto em Nginx:
- Apache — os arquivos
.htaccesstratam a reescrita de URL e a proteção de diretórios. - Nginx — as diretivas
aliasservem os assets e as regrasdeny allprotegem caminhos sensíveis. - Symlinks —
public/themes → ../../themesepublic/templates → ../../templatesexpõ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 layout | Um tema (ou configurações de Aparência para alterações sem código) |
| Adicionar um recurso ou integração | Um plugin usando ações e filtros |
| Alterar comportamento sem código | Configurações |
| Adicionar trabalho agendado | O CronManager, a partir de um plugin |
Próximos passos
Ainda com dúvidas?
Abra um ticket pelo painel e nossa equipe vai ajudá-lo.