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, …)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:
- PHP-versiebeveiliging.
config/php-guard.phpwordt als eerste uitgevoerd — een parse-veilige gate die het opstarten stopt bij een niet-ondersteunde PHP-versie voordat moderne syntaxis wordt geladen. - Bootstrap.
config/app.phpstelt autoloading, de sessie en kernservices in. - Installatiecontrole. Als
App::isInstalled()false is (geenconfig/installed.php), wordt de aanvraag doorgestuurd naar de installatiewizard en wordt niets anders geladen. - Routeregistratie. Admin, API en front-controllers registreren elk hun routes via een statische
::routes()-methode. - Dispatch.
Router::dispatch()matcht de URL en roept de controllermethode aan. - Render. Admin-acties renderen
templates/admin/*; front-acties renderen het actieve theme viaThemeRenderer::render(). - 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
| Concept | Conventie |
|---|---|
| Controllers | AdminXxxController::routes() / FrontXxxController::routes() registreren routes; methoden behandelen aanvragen. |
| Models | Statische methoden: Video::find($id), Video::all($filters), Video::create($data). |
| Database | Database::fetchOne(), fetchAll(), insert(), update(), delete(), count(), transaction(). |
| Router | Router::get(), Router::post(), Router::param('name'), Router::redirect(). |
| Admin-templates | Router::render('admin/videos', […]) → templates/admin/videos.php (laadt layout.php + een _videos.php-partial). |
| Front-templates | ThemeRenderer::render('home', […]) → actieve theme-template + zijn layout.php. |
| Migraties | sql/NNN_name.sql, automatisch uitgevoerd door Migrator::run() tijdens installatie en update. |
| Hooks | HookSystem::doAction('event') en HookSystem::applyFilter('filter', $value). |
Webserverondersteuning
TubePress draait op zowel Apache als Nginx:
- Apache —
.htaccess-bestanden regelen URL-herschrijving en mapbeveiliging. - Nginx —
alias-directives serveren assets endeny all-regels beschermen gevoelige paden. - Symlinks —
public/themes → ../../themesenpublic/templates → ../../templatesmaken 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 wijzigen | Een theme (of Weergave-instellingen voor aanpassingen zonder code) |
| Een functie of integratie toevoegen | Een plugin met acties & filters |
| Gedrag wijzigen zonder code | Instellingen |
| Gepland werk toevoegen | De CronManager, vanuit een plugin |
Volgende stappen
Nog vastgelopen?
Open een ticket vanuit uw dashboard en ons team helpt u verder.