アーキテクチャ
コアのレイアウト、リクエストのライフサイクル、そして TubePress が採用するノーフレームワークの規約について解説します。
TubePress は意図的にシンプルなソフトウェアです。フレームワークも、依存性注入コンテナも、ビルドステップも不要です — 静的クラスを使用した、整然とした最新の PHP だけです。このページでは、CMS を自信を持って拡張できるよう、各パーツがどのように組み合わさっているか、またコードをどこに配置すべきかを説明します。
設計の理念
コードベース全体を形作る3つの考え方があります:
- フレームワーク不使用。 カスタム静的クラスを使用したピュア PHP です。壊れるような 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 を通じて処理されます:
- PHP バージョンガード。
config/php-guard.phpが最初に実行されます — 最新の構文がロードされる前に、サポートされていない PHP バージョンでの起動を防ぐ、解析安全なゲートです。 - ブートストラップ。
config/app.phpがオートロード、セッション、コアサービスをセットアップします。 - インストール確認。
App::isInstalled()が false の場合(config/installed.phpがない場合)、リクエストはインストールウィザードにルーティングされ、他は何もロードされません。 - ルート登録。 管理者、API、フロントコントローラーはそれぞれ静的な
::routes()メソッドを通じてルートを登録します。 - ディスパッチ。
Router::dispatch()が URL を照合し、コントローラーメソッドを呼び出します。 - レンダリング。 管理者アクションは
templates/admin/*をレンダリングし、フロントアクションはThemeRenderer::render()を通じてアクティブなテーマをレンダリングします。 - レンダリング後の処理。 インプレッションがフラッシュされ、
CronManager::run()が実行予定のタスクを起動します。
フロントページのルート(静的ページのためのキャッチオール /{slug})は最後に登録されるため、実際のルートを隠してしまうことはありません。
コアの規約
| 概念 | 規約 |
|---|---|
| コントローラー | AdminXxxController::routes() / FrontXxxController::routes() がルートを登録し、メソッドがリクエストを処理します。 |
| モデル | 静的メソッド: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()。 |
| 管理者テンプレート | 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 を使用 |