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, …)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:
- Guardia de versión PHP.
config/php-guard.phpse 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. - Bootstrap.
config/app.phpconfigura la carga automática, la sesión y los servicios principales. - Verificación de instalación. Si
App::isInstalled()es false (sinconfig/installed.php), la solicitud se redirige al asistente de instalación y no se carga nada más. - Registro de rutas. Los controladores de administración, API y front-end registran sus rutas mediante un método estático
::routes(). - Despacho.
Router::dispatch()hace coincidir la URL y llama al método del controlador. - Renderizado. Las acciones de administración renderizan
templates/admin/*; las acciones del front-end renderizan el tema activo a través deThemeRenderer::render(). - 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
| Concepto | Convención |
|---|---|
| Controladores | AdminXxxController::routes() / FrontXxxController::routes() registran rutas; los métodos gestionan las solicitudes. |
| Modelos | Métodos estáticos: Video::find($id), Video::all($filters), Video::create($data). |
| Base de datos | Database::fetchOne(), fetchAll(), insert(), update(), delete(), count(), transaction(). |
| Router | Router::get(), Router::post(), Router::param('name'), Router::redirect(). |
| Plantillas de administración | Router::render('admin/videos', […]) → templates/admin/videos.php (carga layout.php + un parcial _videos.php). |
| Plantillas del front-end | ThemeRenderer::render('home', […]) → plantilla del tema activo + su layout.php. |
| Migraciones | sql/NNN_name.sql, ejecutadas automáticamente por Migrator::run() durante la instalación y actualización. |
| Hooks | HookSystem::doAction('event') y HookSystem::applyFilter('filter', $value). |
Compatibilidad con servidor web
TubePress funciona tanto con Apache como con Nginx:
- Apache — los archivos
.htaccessgestionan la reescritura de URL y la protección de directorios. - Nginx — las directivas
aliassirven los recursos y las reglasdeny allprotegen las rutas sensibles. - Symlinks —
public/themes → ../../themesypublic/templates → ../../templatesexponen 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ño | Un tema (o ajustes de Apariencia para cambios sin código) |
| Añadir una función o integración | Un plugin usando acciones & filtros |
| Cambiar el comportamiento sin código | Ajustes |
| Añadir trabajo programado | El CronManager, desde un plugin |
Próximos pasos
¿Todavía con dudas?
Abre un ticket desde tu panel y nuestro equipo te ayudará.