Architettura
La struttura del core, il ciclo di vita della richiesta e le convenzioni senza framework adottate da TubePress.
TubePress è un software volutamente semplice. Non vi è nessun framework, nessun contenitore di dependency-injection e nessuna fase di build — solo PHP moderno ben organizzato che utilizza classi statiche. Questa pagina spiega come i componenti si incastrano tra loro, così puoi estendere il CMS con sicurezza e sapere esattamente dove appartiene il tuo codice.
Filosofia di design
Tre idee plasmano l'intera base di codice:
- Nessun framework. PHP puro con classi statiche personalizzate. Non ci sono dipendenze runtime di Composer che possono rompersi e nulla da imparare oltre a PHP stesso.
- Un core fisso, add-on liberi. Il core è aggiornabile e non deve mai essere modificato direttamente. Tutto ciò che personalizzi si trova in temi, plugin o impostazioni.
- Progettato per scalare e sopravvivere su hosting economici. Il lavoro pesante è suddiviso in blocchi e un pseudo-cron integrato significa che non è necessario un crontab di sistema.
Struttura delle directory
Il repository separa il core (fisso, aggiornabile) dagli add-on (installati e rimossi dagli utenti).
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/ o templates/ può essere sovrascritta da un aggiornamento. Metti le tue modifiche in un tema o plugin affinché sopravvivano.Il ciclo di vita delle richieste
Ogni richiesta fluisce attraverso public/index.php nello stesso ordine:
- Guardia versione PHP.
config/php-guard.phpviene eseguito per primo — un gate sicuro per il parsing che blocca l'avvio su una versione PHP non supportata prima che venga caricata qualsiasi sintassi moderna. - Bootstrap.
config/app.phpimposta l'autoloading, la sessione e i servizi core. - Verifica installazione. Se
App::isInstalled()è false (nessunconfig/installed.php), la richiesta viene instradata alla procedura guidata di installazione e non viene caricato nient'altro. - Registrazione route. I controller Admin, API e front registrano ciascuno le proprie route tramite un metodo statico
::routes(). - Dispatch.
Router::dispatch()abbina l'URL e chiama il metodo del controller. - Render. Le azioni admin renderizzano
templates/admin/*; le azioni front renderizzano il tema attivo tramiteThemeRenderer::render(). - Lavoro post-render. Le impressioni vengono scaricate e
CronManager::run()avvia le attività scadute.
Le route della pagina principale (il catch-all /{slug} per le pagine statiche) vengono registrate per ultime, così non oscurano mai le route reali.
Convenzioni del core
| Concetto | Convenzione |
|---|---|
| Controller | AdminXxxController::routes() / FrontXxxController::routes() registrano le route; i metodi gestiscono le richieste. |
| Modelli | Metodi statici: 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(). |
| Template admin | Router::render('admin/videos', […]) → templates/admin/videos.php (carica layout.php + un _videos.php partial). |
| Template front | ThemeRenderer::render('home', […]) → template del tema attivo + il suo layout.php. |
| Migrazioni | sql/NNN_name.sql, eseguite automaticamente da Migrator::run() durante l'installazione e l'aggiornamento. |
| Hook | HookSystem::doAction('event') e HookSystem::applyFilter('filter', $value). |
Supporto web server
TubePress funziona sia su Apache che su Nginx:
- Apache — i file
.htaccessgestiscono la riscrittura URL e la protezione delle directory. - Nginx — le direttive
aliasservono gli asset e le regoledeny allproteggono i percorsi sensibili. - Symlink —
public/themes → ../../themesepublic/templates → ../../templatesespongono gli asset di temi e admin mantenendo il sorgente PHP fuori dalla web root.
La web root è sempre public/. Tutto ciò che è sensibile — config/, src/, sql/, storage/ — si trova fuori di essa ed è ulteriormente bloccato a livello server.
Dove personalizzare
| Vuoi… | Fallo in… |
|---|---|
| Cambiare aspetto e layout | Un tema (o le impostazioni Aspetto per modifiche senza codice) |
| Aggiungere una funzionalità o un'integrazione | Un plugin usando azioni e filtri |
| Modificare il comportamento senza codice | Impostazioni |
| Aggiungere lavoro pianificato | Il CronManager, da un plugin |
Prossimi passi
Ancora bloccato?
Apri un ticket dalla tua dashboard e il nostro team ti aiuterà.