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 |