Architektura
Układ rdzenia, cykl życia żądania oraz konwencje bez frameworka, którymi kieruje się TubePress.
TubePress to celowo prosta aplikacja. Nie ma tu frameworku, kontenera wstrzykiwania zależności ani etapu budowania — tylko dobrze zorganizowane, nowoczesne PHP z klasami statycznymi. Ta strona wyjaśnia, jak poszczególne elementy łączą się ze sobą, abyś mógł pewnie rozszerzać CMS i wiedzieć dokładnie, gdzie należy Twój kod.
Filozofia projektu
Trzy idee kształtują całą bazę kodu:
- Brak frameworku. Czysty PHP z niestandardowymi klasami statycznymi. Nie ma zależności runtime Composer, które mogłyby się zepsuć, i nic do nauki poza samym PHP.
- Stały rdzeń, wolne dodatki. Rdzeń można aktualizować i nigdy nie należy go bezpośrednio edytować. Wszystko, co dostosowujesz, znajduje się w motywach, wtyczkach lub ustawieniach.
- Zbudowany do skalowania i pracy na tanich hostingach. Ciężkie zadania są porcjowane, a wbudowany pseudo-cron oznacza, że nie jest wymagany systemowy crontab.
Struktura katalogów
Repozytorium rozdziela rdzeń (stały, aktualizowalny) od dodatków (instalowanych i usuwanych przez użytkowników).
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/ lub templates/ może zostać nadpisane przez aktualizację. Umieszczaj zmiany w motywie lub wtyczce, aby przetrwały.Cykl życia żądania
Każde żądanie przepływa przez public/index.php w tej samej kolejności:
- Strażnik wersji PHP.
config/php-guard.phpuruchamia się jako pierwszy — bezpieczna dla parsowania bramka, która zatrzymuje uruchamianie na nieobsługiwanej wersji PHP, zanim załadowana zostanie jakakolwiek nowoczesna składnia. - Bootstrap.
config/app.phpkonfiguruje autoładowanie, sesję i podstawowe usługi. - Sprawdzenie instalacji. Jeśli
App::isInstalled()zwraca false (brakconfig/installed.php), żądanie jest kierowane do kreatora instalacji i nic więcej się nie ładuje. - Rejestracja tras. Kontrolery administracyjne, API i frontowe rejestrują swoje trasy za pomocą statycznej metody
::routes(). - Przekazanie żądania.
Router::dispatch()dopasowuje URL i wywołuje metodę kontrolera. - Renderowanie. Akcje administracyjne renderują
templates/admin/*; akcje frontowe renderują aktywny motyw przezThemeRenderer::render(). - Praca po renderowaniu. Wyświetlenia są zapisywane, a
CronManager::run()uruchamia wszystkie zaległe zadania.
Trasy stron frontowych (obsługa /{slug} dla stron statycznych) są rejestrowane na końcu, aby nigdy nie zasłaniać prawdziwych tras.
Konwencje rdzenia
| Koncepcja | Konwencja |
|---|---|
| Kontrolery | AdminXxxController::routes() / FrontXxxController::routes() rejestrują trasy; metody obsługują żądania. |
| Modele | Metody statyczne: Video::find($id), Video::all($filters), Video::create($data). |
| Baza danych | Database::fetchOne(), fetchAll(), insert(), update(), delete(), count(), transaction(). |
| Router | Router::get(), Router::post(), Router::param('name'), Router::redirect(). |
| Szablony administracyjne | Router::render('admin/videos', […]) → templates/admin/videos.php (ładuje layout.php + część _videos.php). |
| Szablony frontowe | ThemeRenderer::render('home', […]) → szablon aktywnego motywu + jego layout.php. |
| Migracje | sql/NNN_name.sql, uruchamiane automatycznie przez Migrator::run() podczas instalacji i aktualizacji. |
| Hooki | HookSystem::doAction('event') i HookSystem::applyFilter('filter', $value). |
Obsługa serwera WWW
TubePress działa zarówno na Apache, jak i Nginx:
- Apache — pliki
.htaccessobsługują przepisywanie URL-i i ochronę katalogów. - Nginx — dyrektywy
aliasserwują zasoby, a regułydeny allchronią wrażliwe ścieżki. - Dowiązania symboliczne —
public/themes → ../../themesipublic/templates → ../../templatesudostępniają zasoby motywu i panelu administracyjnego, zachowując kod źródłowy PHP poza katalogiem głównym witryny.
Katalog główny witryny to zawsze public/. Wszystko wrażliwe — config/, src/, sql/, storage/ — leży poza nim i jest dodatkowo blokowane na poziomie serwera.
Gdzie dostosowywać
| Chcesz… | Zrób to w… |
|---|---|
| Zmienić wygląd i układ | Motyw (lub ustawienia Wyglądu dla zmian bez kodu) |
| Dodać funkcję lub integrację | Wtyczka używająca akcji i filtrów |
| Zmienić zachowanie bez kodu | Ustawienia |
| Dodać zaplanowane zadania | CronManager, z poziomu wtyczki |
Następne kroki
Nadal masz problem?
Otwórz zgłoszenie z poziomu panelu, a nasz zespół Ci pomoże.