El framework PHP detrás de SitioYa

Documentación de Koshkil

Primeros pasos

Estructura del proyecto

Vista general

proyecto/
├── .htaccess              reenvía todo a webroot/
├── composer.json          Smarty 4, Pusher, PhpSpreadsheet
├── app/
│   ├── bin/               scripts: setup.sh, warm-cache, create-plugin.sh, build-docs.py
│   └── docs-src/          fuentes Markdown de esta documentación
├── config/                configuración global
│   ├── config.php, datasources.php, cache.php, sessions.php,
│   │   extensions.php, rewrite.php, i18n.php, email.php
│   ├── locales/{es,en,pt}/*.json   traducciones del núcleo
│   └── domains/<dominio>/          sobrescrituras por dominio
├── core/                  el framework (no se modifica por proyecto)
├── src/                   el código de la aplicación
├── plugins/<nombre>/      módulos opcionales
├── webroot/               lo único servido al navegador
│   ├── index.php          punto de entrada
│   ├── js/, css/, img/    recursos comunes
│   └── themes/<theme>/    plantillas y recursos de cada theme
├── tmp/                   cache/, logs/, sessions/ (escribible)
└── vendor/                dependencias de Composer

core/: el framework

Carpeta Contenido
Koshkil.php Clase estática central: carga de archivos, configuración, enlaces, POST previo. Al incluirla se carga la configuración y se registra el manejador de errores.
KoshkilApplication.php Ciclo principal: run() parsea la ruta, invoca la acción y renderiza la respuesta.
http/ Route, RewriteManager, Request, Response, Session (y session/DatabaseSession), WebElements.
web/ Controller, AjaxController, JavascriptController, View, TWidget, ActionDispatcher, Controller/Component, Plugins/PluginsManager, Rest/.
db/ TModel, TQueryBuilder, Manager (sincronización del esquema), schema/ (definición de tablas), traits/ (jerarquía, orden, propiedad, traducción, multimedia), drivers/.
models/ Modelos del núcleo: usuarios, roles, reglas, perfiles, sesiones, galería, idiomas…
cache/ CacheManager y los motores File, Redis y Null.
tools/ Configure, I18n, Inflector, TCollection, KoshkilLog, Profiler, Sanitize y utils/ (fechas, cadenas, archivos, imágenes, email…).
exceptions/ ExceptionRenderer (manejadores globales) y excepciones propias.
events/ TEventManagerTrait, el sistema de eventos de los modelos.
network/ Clientes curl y ftp.
library/ Librerías incluidas (PHPMailer).

src/: la aplicación

Ruta Rol
Application.php Extiende KoshkilApplication. Inicializa la caché en startup().
SuperController.php Base de los controladores del sitio público (templateFolder = "front", acceso abierto, usuario de sesión).
AdminSuperController.php Base del panel (templateFolder = "admin", requiere login, menú, theme inspinia).
FrontAjaxController.php, AdminAjaxController.php Bases para respuestas JSON.
FrontJavascriptController.php, AdminJavascriptController.php Bases para respuestas JavaScript generadas en el servidor.
Controllers/ Controladores. Las subcarpetas forman parte de la URL (Ajax/, Admin/, Js/…).
Controllers/Components/ Componentes reutilizables entre controladores.
Models/ Modelos propios del proyecto (se buscan antes que los de core/models/).
Widgets/ Widgets (front/THeader.php, admin/TUploads.php…).
Smarty/plugins/ Funciones, bloques y modificadores de Smarty propios.
api/ Endpoints de la API REST (usuarios.php → acciones usuarios.*).
Migrations/ Scripts SQL versionados (ver Modelos).

Espacios de nombres de Koshkil::Uses()

Koshkil no usa namespaces de PHP ni autoload propio: cada archivo se incluye con una ruta con puntos.

Prefijo Carpeta Ejemplo Archivo
sys. core/ sys.http.Route core/http/Route.php
com. src/ com.SuperController src/SuperController.php
plugins.<p>. plugins/<p>/src/ plugins.noticias.Models.noticias plugins/noticias/src/Models/noticias.php
Koshkil::Uses('sys.tools.utils.fileUtils');
Koshkil::Uses('com.Widgets.front.THeader');
Koshkil::Uses('com.Models.productos', 'sys.models.productos'); // segundo argumento: alternativa

Uses() devuelve true si encontró el archivo. Para modelos y comportamientos hay atajos que además crean alias de clase: Koshkil::UsesModel() y Koshkil::UsesBehavior().

Nomenclatura

Elemento Convención Ejemplo
Controlador <Nombre>Controller en src/Controllers/<Nombre>Controller.php CuentasController
Acción método público; la URL reset-password llama a resetPassword() /cuentas/reset-password
Modelo clase TModel<Nombre> en Models/<nombre>.php, alias TM<Nombre> TModelUsuarios / TMUsuarios
Widget clase T<Nombre> en Widgets/<grupo>/T<Nombre>.php, plantilla widgets/<grupo>/<nombre>.tpl THeader
Endpoint de API clase <Clase>ApiController en src/api/<clase>.php UsuariosApiController
Tabla prefijo tbl_; columnas con prefijo de 3 letras tbl_usuarios.usr_email