Ga naar inhoud
TubePress — gratis, zelf gehost & actief onderhouden
Ontwikkelaarsreferentie

Architectuur

De kernopbouw, de levenscyclus van een request en de conventies zonder framework die TubePress volgt.

TubePress is bewust eenvoudige software. Er is geen framework, geen dependency-injection-container en geen buildstap — alleen goed georganiseerde, moderne PHP met statische klassen. Deze pagina legt uit hoe de onderdelen samenwerken, zodat je de CMS met vertrouwen kunt uitbreiden en precies weet waar je code thuishoort.

Ontwerpfilosofie

Drie ideeën bepalen de gehele codebase:

  • Geen framework. Pure PHP met aangepaste statische klassen. Er zijn geen Composer runtime-afhankelijkheden die kunnen breken en je hoeft niets meer te leren dan PHP zelf.
  • Een vaste kern, vrije add-ons. De kern is bijwerkbaar en mag nooit rechtstreeks worden bewerkt. Alles wat je aanpast, staat in themes, plugins of instellingen.
  • Gebouwd om te schalen en te overleven op goedkope hosting. Zwaar werk wordt opgesplitst, en een ingebouwde pseudo-cron betekent dat geen systeem-crontab nodig is.

Mappenstructuur

De repository scheidt de kern (vast, bijwerkbaar) van add-ons (geïnstalleerd en verwijderd door gebruikers).

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, …)
Bewerk de kern nooit om aan te passen. Alles onder src/, config/, sql/ of templates/ kan worden overschreven door een update. Bewaar je wijzigingen in een theme of plugin zodat ze behouden blijven.

De aanvraagcyclus

Elke aanvraag doorloopt public/index.php in dezelfde volgorde:

  1. PHP-versiebeveiliging. config/php-guard.php wordt als eerste uitgevoerd — een parse-veilige gate die het opstarten stopt bij een niet-ondersteunde PHP-versie voordat moderne syntaxis wordt geladen.
  2. Bootstrap. config/app.php stelt autoloading, de sessie en kernservices in.
  3. Installatiecontrole. Als App::isInstalled() false is (geen config/installed.php), wordt de aanvraag doorgestuurd naar de installatiewizard en wordt niets anders geladen.
  4. Routeregistratie. Admin, API en front-controllers registreren elk hun routes via een statische ::routes()-methode.
  5. Dispatch. Router::dispatch() matcht de URL en roept de controllermethode aan.
  6. Render. Admin-acties renderen templates/admin/*; front-acties renderen het actieve theme via ThemeRenderer::render().
  7. Werk na het renderen. Impressies worden geflushed en CronManager::run() voert eventuele geplande taken uit.

Voorpaginaroutes (de /{slug} catch-all voor statische pagina's) worden als laatste geregistreerd, zodat ze echte routes nooit verbergen.

Kernconventies

ConceptConventie
ControllersAdminXxxController::routes() / FrontXxxController::routes() registreren routes; methoden behandelen aanvragen.
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 (laadt layout.php + een _videos.php-partial).
Front-templatesThemeRenderer::render('home', […]) → actieve theme-template + zijn layout.php.
Migratiessql/NNN_name.sql, automatisch uitgevoerd door Migrator::run() tijdens installatie en update.
HooksHookSystem::doAction('event') en HookSystem::applyFilter('filter', $value).

Webserverondersteuning

TubePress draait op zowel Apache als Nginx:

  • Apache.htaccess-bestanden regelen URL-herschrijving en mapbeveiliging.
  • Nginxalias-directives serveren assets en deny all-regels beschermen gevoelige paden.
  • Symlinkspublic/themes → ../../themes en public/templates → ../../templates maken theme- en admin-assets toegankelijk terwijl PHP-broncode buiten de webroot blijft.

De webroot is altijd public/. Alles wat gevoelig is — config/, src/, sql/, storage/ — bevindt zich buiten de webroot en wordt bovendien geblokkeerd op serverniveau.

Waar aanpassen

Je wilt…Doe het in…
Uiterlijk en indeling wijzigenEen theme (of Weergave-instellingen voor aanpassingen zonder code)
Een functie of integratie toevoegenEen plugin met acties & filters
Gedrag wijzigen zonder codeInstellingen
Gepland werk toevoegenDe CronManager, vanuit een plugin

Volgende stappen

Nog vastgelopen?

Open een ticket vanuit uw dashboard en ons team helpt u verder.

Probeer de live demo → TubePress downloaden →