Aller au contenu
TubePress — gratuit, auto-hébergé & activement maintenu
Référence développeur

Architecture

L’organisation du cœur, le cycle de vie d’une requête et les conventions sans framework adoptées par TubePress.

TubePress est un logiciel délibérément simple. Il n'y a pas de framework, pas de conteneur d'injection de dépendances et pas d'étape de compilation — juste du PHP moderne et bien organisé utilisant des classes statiques. Cette page explique comment les éléments s'articulent afin que vous puissiez étendre le CMS en toute confiance et savoir exactement où votre code doit aller.

Philosophie de conception

Trois idées façonnent l'ensemble de la base de code :

  • Pas de framework. PHP pur avec des classes statiques personnalisées. Il n'y a pas de dépendances Composer à l'exécution pouvant casser, et rien à apprendre au-delà de PHP lui-même.
  • Un cœur fixe, des extensions libres. Le cœur est mis à jour automatiquement et ne doit jamais être modifié directement. Tout ce que vous personnalisez se trouve dans les thèmes, les plugins ou les paramètres.
  • Conçu pour évoluer et pour survivre sur un hébergement modeste. Les tâches lourdes sont découpées en morceaux, et un pseudo-cron intégré signifie qu'aucun crontab système n'est nécessaire.

Structure des répertoires

Le dépôt sépare le cœur (fixe, mis à jour) des extensions (installées et supprimées par les utilisateurs).

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, …)
Ne jamais modifier le cœur pour personnaliser. Tout ce qui se trouve sous src/, config/, sql/ ou templates/ peut être écrasé par une mise à jour. Placez vos modifications dans un thème ou un plugin pour qu'elles survivent.

Le cycle de vie d'une requête

Chaque requête transite par public/index.php dans le même ordre :

  1. Protection de version PHP. config/php-guard.php s'exécute en premier — une barrière sûre au niveau syntaxique qui arrête le démarrage sur une version PHP non prise en charge avant qu'une syntaxe moderne ne soit chargée.
  2. Bootstrap. config/app.php configure l'autoloading, la session et les services de base.
  3. Vérification d'installation. Si App::isInstalled() retourne false (pas de config/installed.php), la requête est redirigée vers l'assistant d'installation et rien d'autre n'est chargé.
  4. Enregistrement des routes. Les contrôleurs admin, API et front enregistrent chacun leurs routes via une méthode statique ::routes().
  5. Dispatch. Router::dispatch() correspond à l'URL et appelle la méthode du contrôleur.
  6. Rendu. Les actions admin affichent templates/admin/* ; les actions front affichent le thème actif via ThemeRenderer::render().
  7. Travail post-rendu. Les impressions sont vidées et CronManager::run() déclenche toutes les tâches planifiées.

Les routes de page (le catch-all /{slug} pour les pages statiques) sont enregistrées en dernier, afin de ne jamais masquer les vraies routes.

Conventions du cœur

ConceptConvention
ContrôleursAdminXxxController::routes() / FrontXxxController::routes() enregistrent les routes ; les méthodes gèrent les requêtes.
ModèlesMéthodes statiques : Video::find($id), Video::all($filters), Video::create($data).
Base de donnéesDatabase::fetchOne(), fetchAll(), insert(), update(), delete(), count(), transaction().
RouterRouter::get(), Router::post(), Router::param('name'), Router::redirect().
Templates adminRouter::render('admin/videos', […])templates/admin/videos.php (charge layout.php + un partiel _videos.php).
Templates frontThemeRenderer::render('home', […]) → template du thème actif + son layout.php.
Migrationssql/NNN_name.sql, exécutées automatiquement par Migrator::run() lors de l'installation et de la mise à jour.
HooksHookSystem::doAction('event') et HookSystem::applyFilter('filter', $value).

Support du serveur web

TubePress fonctionne sur Apache et Nginx :

  • Apache — les fichiers .htaccess gèrent la réécriture d'URL et la protection des répertoires.
  • Nginx — les directives alias servent les ressources et les règles deny all protègent les chemins sensibles.
  • Liens symboliquespublic/themes → ../../themes et public/templates → ../../templates exposent les ressources de thème et d'administration tout en gardant le code source PHP en dehors de la racine web.

La racine web est toujours public/. Tout ce qui est sensible — config/, src/, sql/, storage/ — se trouve en dehors et est en outre bloqué au niveau du serveur.

Où personnaliser

Vous souhaitez…Faites-le dans…
Modifier l'apparence & la mise en pageUn thème (ou les paramètres d'apparence pour des modifications sans code)
Ajouter une fonctionnalité ou une intégrationUn plugin utilisant des actions & des filtres
Modifier le comportement sans codeParamètres
Ajouter des tâches planifiéesLe CronManager, depuis un plugin

Prochaines étapes

Toujours bloqué ?

Ouvrez un ticket depuis votre tableau de bord et notre équipe vous assistera.

Essayer la démo en direct → Télécharger TubePress →