Zum Inhalt springen
TubePress — kostenlos, selbst gehostet & aktiv gepflegt
Entwicklerreferenz

Architektur

Der Aufbau des Cores, der Request-Lebenszyklus und die Framework-losen Konventionen, denen TubePress folgt.

TubePress ist eine bewusst einfach gehaltene Software. Es gibt kein Framework, keinen Dependency-Injection-Container und keinen Build-Schritt – nur gut organisiertes, modernes PHP mit statischen Klassen. Diese Seite erklärt, wie die Teile zusammenpassen, damit Sie das CMS sicher erweitern können und genau wissen, wo Ihr Code hingehört.

Designphilosophie

Drei Grundideen prägen die gesamte Codebasis:

  • Kein Framework. Reines PHP mit eigenen statischen Klassen. Es gibt keine Composer-Laufzeitabhängigkeiten, die brechen können, und nichts zu lernen außer PHP selbst.
  • Ein fester Kern, freie Add-ons. Der Kern ist aktualisierbar und sollte niemals direkt bearbeitet werden. Alles, was Sie anpassen, befindet sich in Themes, Plugins oder Einstellungen.
  • Skalierbar und für günstiges Hosting geeignet. Schwere Aufgaben werden in Blöcke aufgeteilt, und ein eingebauter Pseudo-cron bedeutet, dass kein System-crontab erforderlich ist.

Verzeichnisstruktur

Das Repository trennt den Kern (fest, aktualisierbar) von Add-ons (von Benutzern installiert und entfernt).

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, …)
Den Kern niemals zur Anpassung bearbeiten. Alles unter src/, config/, sql/ oder templates/ kann durch ein Update überschrieben werden. Platzieren Sie Ihre Änderungen in einem Theme oder Plugin, damit sie erhalten bleiben.

Der Request-Lebenszyklus

Jeder Request fließt in der gleichen Reihenfolge durch public/index.php:

  1. PHP-Versionsschutz. config/php-guard.php wird zuerst ausgeführt – ein parse-sicheres Gate, das den Start bei einer nicht unterstützten PHP-Version anhält, bevor moderne Syntax geladen wird.
  2. Bootstrap. config/app.php richtet Autoloading, die Session und die Kerndienste ein.
  3. Installationsprüfung. Wenn App::isInstalled() false ist (kein config/installed.php), wird der Request zum Installationsassistenten weitergeleitet und nichts anderes wird geladen.
  4. Routen-Registrierung. Admin-, API- und Front-Controller registrieren ihre Routen jeweils über eine statische ::routes()-Methode.
  5. Dispatch. Router::dispatch() findet die passende URL und ruft die Controller-Methode auf.
  6. Render. Admin-Aktionen rendern templates/admin/*; Front-Aktionen rendern das aktive Theme über ThemeRenderer::render().
  7. Nachbearbeitung. Impressionen werden geleert und CronManager::run() führt fällige Aufgaben aus.

Frontend-Routen (der /{slug} Catch-All für statische Seiten) werden zuletzt registriert, damit sie echte Routen nicht überdecken.

Kern-Konventionen

KonzeptKonvention
ControllersAdminXxxController::routes() / FrontXxxController::routes() registrieren Routen; Methoden verarbeiten Requests.
ModelsStatische Methoden: 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().
Admin templatesRouter::render('admin/videos', […])templates/admin/videos.php (lädt layout.php + ein _videos.php-Partial).
Front templatesThemeRenderer::render('home', […]) → aktives Theme-Template + sein layout.php.
Migrationssql/NNN_name.sql, werden automatisch von Migrator::run() bei Installation und Update ausgeführt.
HooksHookSystem::doAction('event') und HookSystem::applyFilter('filter', $value).

Webserver-Unterstützung

TubePress läuft sowohl auf Apache als auch auf Nginx:

  • Apache.htaccess-Dateien übernehmen URL-Umschreibung und Verzeichnisschutz.
  • Nginxalias-Direktiven liefern Assets und deny all-Regeln schützen sensible Pfade.
  • Symlinkspublic/themes → ../../themes und public/templates → ../../templates stellen Theme- und Admin-Assets bereit, während der PHP-Quellcode außerhalb des Webroot bleibt.

Das Webroot ist immer public/. Alles Sensible – config/, src/, sql/, storage/ – liegt außerhalb davon und ist zusätzlich auf Serverebene gesperrt.

Wo anpassen

Sie möchten…Dann hier…
Aussehen und Layout ändernEin Theme (oder Erscheinungsbild-Einstellungen für Code-freie Änderungen)
Eine Funktion oder Integration hinzufügenEin Plugin mit Actions & Filtern
Verhalten ohne Code ändernEinstellungen
Geplante Aufgaben hinzufügenDen CronManager, aus einem Plugin

Nächste Schritte

Noch Hilfe benötigt?

Erstellen Sie ein Ticket in Ihrem Dashboard und unser Team hilft Ihnen gerne weiter.

Live-Demo ausprobieren → TubePress herunterladen →