Desarrollo
Tests
Suite de tests sin dependencias externas (runner propio, sin PHPUnit):
php tests/run.php
Cubre seguridad de la API, logger, generadores y el motor del page-builder (plantillas, formularios, control de acceso). Devuelve código de salida 0/1 (apto para CI).
La mayoría de los tests leen el código fuente: por eso corren en cualquier
máquina, sin base de datos, y por eso no ven si algo funciona. Para eso está
tests/restaurant_e2e_test.php, que atiende una mesa completa —abrir, pedir,
cocinar, entregar, cobrar, descontar la receta, cuadrar la caja y anular— con
los mismos controladores que usa el panel:
- Crea su propia base desechable (
wf_e2e_<pid>), le aplica las migraciones del plugin y la borra al terminar. Nunca toca la base del sitio. - Si no hay MySQL a mano, o el usuario no puede crear bases, se omite en vez de fallar.
- Apunta los controladores a esa base con
Connection::useTestLink(), que sólo funciona desde la línea de comandos.
Si escribes un flujo que cruza varias tablas, éste es el molde a copiar.
Generadores CLI (tools/)
Scaffolders que reutilizan funciones puras (testeadas) como backend:
php tools/make-web-page.php <tabla> [opciones] # página web (lista/detalle)
php tools/make-migration.php <nombre> --date YYYY-MM-DD [columnas]
php tools/make-table.php config.json # tabla + CRUD admin (JSON)
php tools/make-page.php config.json # página pública desde JSON
php tools/introspect.php # snapshot: plugins activos, tablas, relaciones
php tools/doctor.php --json # diagnóstico del entorno (exit 1 si hay errores)
php tools/schema.php [tabla] # qué existe: secciones, columnas, páginas
php tools/make-column.php <tabla> --name=<campo> --type=<tipo> # agregar campo a una sección existente
php tools/seed.php <tabla> datos.json [--key=<col>] # cargar datos (idempotente con --key)
php tools/make-plugin.php <nombre-kebab> # esqueleto de plugin
tools/page-builder.php— motor del Generador de Páginas (plantillas, formularios, login/acceso). Usado por el CMS y testeado.tools/setup.php— creación de config/directorios (lo llamasetup.sh).
Logger
core/logger.php — logger central que nunca lanza excepciones (cae a
error_log). Escribe en logs/ (denegado por web, archivo diario).
Logger::error('mensaje', ['contexto' => 1]);
Logger::warning(...); Logger::info(...); Logger::debug(...);
Permisos / diagnóstico
core/permissions.php + la página "Estado del Sistema" del CMS diagnostican
y reparan (en lo posible) los directorios escribibles.
Convenciones
- Comentarios de código en inglés (obligatorio). Docs de usuario en español.
- Controladores:
nombre.controller.php. Servicios:nombre.service.php. - Migraciones descriptivas en
migrations/(add_*.sql,create_*.sql). - Mantén
config.example.phpactualizado al añadir configuración.
Plugins
Cada plugin es autocontenido en plugins/nombre-plugin/ (controllers, views,
assets, config). Se registran en plugins/plugins-registry.php. Sigue la
estructura de los plugins existentes (payku, workflow-manager).
Contribución
- Crea una rama para tu cambio.
- Asegúrate de que
php tests/run.phppase. - Abre un Pull Request a
development.