Перейти к содержимому
TubePress — бесплатный, самостоятельный & активно поддерживаемый
Справочник разработчика

Архитектура

Структура ядра, жизненный цикл запроса и принципы работы без фреймворка, которым следует TubePress.

TubePress — намеренно простое программное обеспечение. Здесь нет фреймворка, контейнера внедрения зависимостей и этапа сборки — только хорошо организованный современный PHP с использованием статических классов. На этой странице объясняется, как части соединяются между собой, чтобы вы могли уверенно расширять CMS и точно знать, где размещать свой код.

Философия проектирования

Три идеи определяют всю кодовую базу:

  • Без фреймворка. Чистый PHP с пользовательскими статическими классами. Нет runtime-зависимостей Composer, которые могли бы сломаться, и нечего изучать помимо самого PHP.
  • Фиксированное ядро, свободные дополнения. Ядро обновляется и не должно редактироваться напрямую. Всё, что вы настраиваете, находится в темах, плагинах или настройках.
  • Создан для масштабирования и работы на дешёвом хостинге. Тяжёлая работа разбивается на части, а встроенный pseudo-cron означает, что системный crontab не требуется.

Структура каталогов

Репозиторий разделяет ядро (фиксированное, обновляемое) и дополнения (устанавливаемые и удаляемые пользователями).

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/ или templates/, может быть перезаписано при обновлении. Помещайте изменения в тему или плагин, чтобы они сохранялись.

Жизненный цикл запроса

Каждый запрос проходит через public/index.php в одном и том же порядке:

  1. Проверка версии PHP. config/php-guard.php выполняется первым — безопасный шлюз, который останавливает загрузку при неподдерживаемой версии PHP до загрузки современного синтаксиса.
  2. Инициализация. config/app.php настраивает автозагрузку, сессию и основные службы.
  3. Проверка установки. Если App::isInstalled() возвращает false (нет config/installed.php), запрос перенаправляется к мастеру установки и ничего больше не загружается.
  4. Регистрация маршрутов. Контроллеры администратора, API и фронтенда регистрируют свои маршруты через статический метод ::routes().
  5. Диспетчеризация. Router::dispatch() сопоставляет URL и вызывает метод контроллера.
  6. Рендеринг. Действия администратора рендерят templates/admin/*; действия фронтенда рендерят активную тему через ThemeRenderer::render().
  7. Работа после рендеринга. Счётчики просмотров сбрасываются, и CronManager::run() запускает все запланированные задачи.

Маршруты страниц (универсальный /{slug} для статических страниц) регистрируются последними, поэтому они никогда не перекрывают реальные маршруты.

Основные соглашения

КонцепцияСоглашение
КонтроллерыAdminXxxController::routes() / FrontXxxController::routes() регистрируют маршруты; методы обрабатывают запросы.
МоделиСтатические методы: Video::find($id), Video::all($filters), Video::create($data).
База данныхDatabase::fetchOne(), fetchAll(), insert(), update(), delete(), count(), transaction().
МаршрутизаторRouter::get(), Router::post(), Router::param('name'), Router::redirect().
Шаблоны администратораRouter::render('admin/videos', […])templates/admin/videos.php (загружает layout.php + частичный шаблон _videos.php).
Шаблоны фронтендаThemeRenderer::render('home', […]) → шаблон активной темы + его layout.php.
Миграцииsql/NNN_name.sql, запускаются автоматически Migrator::run() при установке и обновлении.
ХукиHookSystem::doAction('event') и HookSystem::applyFilter('filter', $value).

Поддержка веб-серверов

TubePress работает как на Apache, так и на Nginx:

  • Apache — файлы .htaccess обрабатывают переписывание URL и защиту каталогов.
  • Nginx — директивы alias обслуживают ресурсы, а правила deny all защищают чувствительные пути.
  • Символические ссылкиpublic/themes → ../../themes и public/templates → ../../templates открывают доступ к ресурсам темы и администратора, сохраняя исходный код PHP за пределами корня веб-сайта.

Корень веб-сайта всегда находится в public/. Всё конфиденциальное — config/, src/, sql/, storage/ — находится за его пределами и дополнительно блокируется на уровне сервера.

Где настраивать

Вы хотите…Делайте это в…
Изменить внешний вид и макетТеме (или в настройках «Внешний вид» для изменений без кода)
Добавить функцию или интеграциюПлагине с использованием действий и фильтров
Изменить поведение без кодаНастройках
Добавить запланированную работуCronManager в плагине

Следующие шаги

Остались вопросы?

Откройте заявку в панели управления, и наша команда поможет.

Попробовать демо → Скачать TubePress →