Vai al contenuto
TubePress — gratuito, self-hosted & attivamente mantenuto
Riferimento per sviluppatori

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, …)
Non modificare mai il core per personalizzare. Qualsiasi cosa sotto 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:

  1. Guardia versione PHP. config/php-guard.php viene 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.
  2. Bootstrap. config/app.php imposta l'autoloading, la sessione e i servizi core.
  3. Verifica installazione. Se App::isInstalled() è false (nessun config/installed.php), la richiesta viene instradata alla procedura guidata di installazione e non viene caricato nient'altro.
  4. Registrazione route. I controller Admin, API e front registrano ciascuno le proprie route tramite un metodo statico ::routes().
  5. Dispatch. Router::dispatch() abbina l'URL e chiama il metodo del controller.
  6. Render. Le azioni admin renderizzano templates/admin/*; le azioni front renderizzano il tema attivo tramite ThemeRenderer::render().
  7. 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

ConcettoConvenzione
ControllerAdminXxxController::routes() / FrontXxxController::routes() registrano le route; i metodi gestiscono le richieste.
ModelliMetodi statici: 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().
Template adminRouter::render('admin/videos', […])templates/admin/videos.php (carica layout.php + un _videos.php partial).
Template frontThemeRenderer::render('home', […]) → template del tema attivo + il suo layout.php.
Migrazionisql/NNN_name.sql, eseguite automaticamente da Migrator::run() durante l'installazione e l'aggiornamento.
HookHookSystem::doAction('event') e HookSystem::applyFilter('filter', $value).

Supporto web server

TubePress funziona sia su Apache che su Nginx:

  • Apache — i file .htaccess gestiscono la riscrittura URL e la protezione delle directory.
  • Nginx — le direttive alias servono gli asset e le regole deny all proteggono i percorsi sensibili.
  • Symlinkpublic/themes → ../../themes e public/templates → ../../templates espongono 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 layoutUn tema (o le impostazioni Aspetto per modifiche senza codice)
Aggiungere una funzionalità o un'integrazioneUn plugin usando azioni e filtri
Modificare il comportamento senza codiceImpostazioni
Aggiungere lavoro pianificatoIl CronManager, da un plugin

Prossimi passi

Ancora bloccato?

Apri un ticket dalla tua dashboard e il nostro team ti aiuterà.

Prova la demo live → Scarica TubePress →