Saltar al contenido
TubePress — gratuito, autoalojado & con mantenimiento activo
Referencia para desarrolladores

Arquitectura

La estructura del núcleo, el ciclo de vida de las solicitudes y las convenciones sin framework que sigue TubePress.

TubePress es un software deliberadamente simple. No hay framework, no hay contenedor de inyección de dependencias ni paso de compilación — solo PHP moderno y bien organizado usando clases estáticas. Esta página explica cómo encajan las piezas para que puedas extender el CMS con confianza y saber exactamente dónde pertenece tu código.

Filosofía de diseño

Tres ideas dan forma a todo el código:

  • Sin framework. PHP puro con clases estáticas personalizadas. No hay dependencias de tiempo de ejecución de Composer que puedan romperse y nada que aprender más allá de PHP en sí.
  • Un núcleo fijo, complementos libres. El núcleo es actualizable y nunca debe editarse directamente. Todo lo que personalizas vive en temas, plugins o ajustes.
  • Construido para escalar y sobrevivir en alojamiento económico. El trabajo pesado se divide en fragmentos, y un pseudo-cron integrado significa que no se requiere un crontab del sistema.

Estructura de directorios

El repositorio separa el núcleo (fijo, actualizable) de los complementos (instalados y eliminados por los usuarios).

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, …)
Nunca edites el núcleo para personalizar. Cualquier cosa dentro de src/, config/, sql/ o templates/ puede ser sobreescrita por una actualización. Coloca tus cambios en un tema o plugin para que sobrevivan.

El ciclo de vida de la solicitud

Cada solicitud fluye a través de public/index.php en el mismo orden:

  1. Guardia de versión PHP. config/php-guard.php se ejecuta primero — una puerta segura de análisis que detiene el arranque en una versión PHP no compatible antes de que se cargue cualquier sintaxis moderna.
  2. Bootstrap. config/app.php configura la carga automática, la sesión y los servicios principales.
  3. Verificación de instalación. Si App::isInstalled() es false (sin config/installed.php), la solicitud se redirige al asistente de instalación y no se carga nada más.
  4. Registro de rutas. Los controladores de administración, API y front-end registran sus rutas mediante un método estático ::routes().
  5. Despacho. Router::dispatch() hace coincidir la URL y llama al método del controlador.
  6. Renderizado. Las acciones de administración renderizan templates/admin/*; las acciones del front-end renderizan el tema activo a través de ThemeRenderer::render().
  7. Trabajo post-renderizado. Las impresiones se vacían y CronManager::run() ejecuta las tareas pendientes.

Las rutas de la página principal (el comodín /{slug} para páginas estáticas) se registran al final, para que nunca oculten rutas reales.

Convenciones del núcleo

ConceptoConvención
ControladoresAdminXxxController::routes() / FrontXxxController::routes() registran rutas; los métodos gestionan las solicitudes.
ModelosMétodos estáticos: Video::find($id), Video::all($filters), Video::create($data).
Base de datosDatabase::fetchOne(), fetchAll(), insert(), update(), delete(), count(), transaction().
RouterRouter::get(), Router::post(), Router::param('name'), Router::redirect().
Plantillas de administraciónRouter::render('admin/videos', […])templates/admin/videos.php (carga layout.php + un parcial _videos.php).
Plantillas del front-endThemeRenderer::render('home', […]) → plantilla del tema activo + su layout.php.
Migracionessql/NNN_name.sql, ejecutadas automáticamente por Migrator::run() durante la instalación y actualización.
HooksHookSystem::doAction('event') y HookSystem::applyFilter('filter', $value).

Compatibilidad con servidor web

TubePress funciona tanto con Apache como con Nginx:

  • Apache — los archivos .htaccess gestionan la reescritura de URL y la protección de directorios.
  • Nginx — las directivas alias sirven los recursos y las reglas deny all protegen las rutas sensibles.
  • Symlinkspublic/themes → ../../themes y public/templates → ../../templates exponen los recursos del tema y de administración mientras mantienen el código fuente PHP fuera de la raíz web.

La raíz web siempre es public/. Todo lo sensible — config/, src/, sql/, storage/ — se encuentra fuera de ella y está bloqueado adicionalmente a nivel del servidor.

Dónde personalizar

Quieres…Hazlo en…
Cambiar la apariencia y el diseñoUn tema (o ajustes de Apariencia para cambios sin código)
Añadir una función o integraciónUn plugin usando acciones & filtros
Cambiar el comportamiento sin códigoAjustes
Añadir trabajo programadoEl CronManager, desde un plugin

Próximos pasos

¿Todavía con dudas?

Abre un ticket desde tu panel y nuestro equipo te ayudará.

Prueba la demo en vivo → Descargar TubePress →