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, …)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 :
- Protection de version PHP.
config/php-guard.phps'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. - Bootstrap.
config/app.phpconfigure l'autoloading, la session et les services de base. - Vérification d'installation. Si
App::isInstalled()retourne false (pas deconfig/installed.php), la requête est redirigée vers l'assistant d'installation et rien d'autre n'est chargé. - Enregistrement des routes. Les contrôleurs admin, API et front enregistrent chacun leurs routes via une méthode statique
::routes(). - Dispatch.
Router::dispatch()correspond à l'URL et appelle la méthode du contrôleur. - Rendu. Les actions admin affichent
templates/admin/*; les actions front affichent le thème actif viaThemeRenderer::render(). - 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
| Concept | Convention |
|---|---|
| Contrôleurs | AdminXxxController::routes() / FrontXxxController::routes() enregistrent les routes ; les méthodes gèrent les requêtes. |
| Modèles | Méthodes statiques : Video::find($id), Video::all($filters), Video::create($data). |
| Base de données | Database::fetchOne(), fetchAll(), insert(), update(), delete(), count(), transaction(). |
| Router | Router::get(), Router::post(), Router::param('name'), Router::redirect(). |
| Templates admin | Router::render('admin/videos', […]) → templates/admin/videos.php (charge layout.php + un partiel _videos.php). |
| Templates front | ThemeRenderer::render('home', […]) → template du thème actif + son layout.php. |
| Migrations | sql/NNN_name.sql, exécutées automatiquement par Migrator::run() lors de l'installation et de la mise à jour. |
| Hooks | HookSystem::doAction('event') et HookSystem::applyFilter('filter', $value). |
Support du serveur web
TubePress fonctionne sur Apache et Nginx :
- Apache — les fichiers
.htaccessgèrent la réécriture d'URL et la protection des répertoires. - Nginx — les directives
aliasservent les ressources et les règlesdeny allprotègent les chemins sensibles. - Liens symboliques —
public/themes → ../../themesetpublic/templates → ../../templatesexposent 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 page | Un thème (ou les paramètres d'apparence pour des modifications sans code) |
| Ajouter une fonctionnalité ou une intégration | Un plugin utilisant des actions & des filtres |
| Modifier le comportement sans code | Paramètres |
| Ajouter des tâches planifiées | Le CronManager, depuis un plugin |
Prochaines étapes
Toujours bloqué ?
Ouvrez un ticket depuis votre tableau de bord et notre équipe vous assistera.