Przejdź do treści
TubePress — bezpłatny, samodzielnie hostowany & aktywnie utrzymywany
Dokumentacja dla deweloperów

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, …)
Nigdy nie edytuj rdzenia w celu dostosowania. Wszystko pod 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:

  1. Strażnik wersji PHP. config/php-guard.php uruchamia się jako pierwszy — bezpieczna dla parsowania bramka, która zatrzymuje uruchamianie na nieobsługiwanej wersji PHP, zanim załadowana zostanie jakakolwiek nowoczesna składnia.
  2. Bootstrap. config/app.php konfiguruje autoładowanie, sesję i podstawowe usługi.
  3. Sprawdzenie instalacji. Jeśli App::isInstalled() zwraca false (brak config/installed.php), żądanie jest kierowane do kreatora instalacji i nic więcej się nie ładuje.
  4. Rejestracja tras. Kontrolery administracyjne, API i frontowe rejestrują swoje trasy za pomocą statycznej metody ::routes().
  5. Przekazanie żądania. Router::dispatch() dopasowuje URL i wywołuje metodę kontrolera.
  6. Renderowanie. Akcje administracyjne renderują templates/admin/*; akcje frontowe renderują aktywny motyw przez ThemeRenderer::render().
  7. 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

KoncepcjaKonwencja
KontroleryAdminXxxController::routes() / FrontXxxController::routes() rejestrują trasy; metody obsługują żądania.
ModeleMetody statyczne: Video::find($id), Video::all($filters), Video::create($data).
Baza danychDatabase::fetchOne(), fetchAll(), insert(), update(), delete(), count(), transaction().
RouterRouter::get(), Router::post(), Router::param('name'), Router::redirect().
Szablony administracyjneRouter::render('admin/videos', […])templates/admin/videos.php (ładuje layout.php + część _videos.php).
Szablony frontoweThemeRenderer::render('home', […]) → szablon aktywnego motywu + jego layout.php.
Migracjesql/NNN_name.sql, uruchamiane automatycznie przez Migrator::run() podczas instalacji i aktualizacji.
HookiHookSystem::doAction('event') i HookSystem::applyFilter('filter', $value).

Obsługa serwera WWW

TubePress działa zarówno na Apache, jak i Nginx:

  • Apache — pliki .htaccess obsługują przepisywanie URL-i i ochronę katalogów.
  • Nginx — dyrektywy alias serwują zasoby, a reguły deny all chronią wrażliwe ścieżki.
  • Dowiązania symbolicznepublic/themes → ../../themes i public/templates → ../../templates udostę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ładMotyw (lub ustawienia Wyglądu dla zmian bez kodu)
Dodać funkcję lub integracjęWtyczka używająca akcji i filtrów
Zmienić zachowanie bez koduUstawienia
Dodać zaplanowane zadaniaCronManager, z poziomu wtyczki

Następne kroki

Nadal masz problem?

Otwórz zgłoszenie z poziomu panelu, a nasz zespół Ci pomoże.

Wypróbuj demo na żywo → Pobierz TubePress →