¿Qué es SunMvc?
Todo proyecto construido sobre SunMvc parte de la misma plantilla en blanco: enrutamiento, controladores/modelos/vistas, autenticación, i18n y gestión de errores ya están conectados y probados, sin código específico de aplicación. En lugar de montar una pila nueva desde cero cada vez, se construye el siguiente proyecto directamente sobre una base que ya funciona, y cada lección de un proyecto anterior (correcciones de enrutamiento, el flujo de autenticación, el mecanismo de la página de error) se incorpora de nuevo a la plantilla para la próxima vez.
Cómo fluye una solicitud
Una solicitud sigue un único camino rastreable: .htaccess reescribe cada URL hacia index.php, que carga el entorno y luego construye, en un orden fijo, los servicios de base de datos, autenticación, filtrado y localización, antes de entregar el control a tu controlador. Cuando tu código se ejecuta, el enrutamiento ya está analizado, el idioma ya está resuelto y la protección CSRF ya se comprobó en cada solicitud POST: escribes la funcionalidad, no la fontanería a su alrededor.
Controladores, modelos, vistas
Controladores, modelos y vistas siguen la misma estructura predecible en todo el proyecto: una clase controlador por segmento de URL, una clase modelo para su acceso a datos, un archivo de vista por controlador (no por pantalla). Las variables locales de un controlador son directamente visibles en su vista: no hay un mecanismo separado de datos de vista que aprender, ni un motor de plantillas contra el que luchar.
Autenticación y seguridad integradas
La autenticación viene completa, no como un ejercicio para el lector: inicio de sesión, registro, gestión de sesiones, restablecimiento de contraseña y autenticación de dos factores TOTP funcionan desde el primer momento contra un esquema de base de datos documentado. La protección CSRF se ejecuta automáticamente en cada solicitud POST. Las carpetas sensibles están bloqueadas ante el acceso directo a nivel del servidor web, no dejadas al código de la aplicación.
La internacionalización que estás usando ahora mismo
Cada cadena visible del framework pasa por la misma capa de traducción que estás leyendo ahora mismo: esta misma página se renderiza en el idioma que elegiste, usando las propias funciones _t()/_tr() del framework y una tabla de traducción plana en JSON. Añadir un idioma consiste en añadir un código y un archivo de traducción, sin necesidad de cambiar código.
La biblioteca de clases Sun*
Una pequeña biblioteca de clases independientes del framework se encarga de lo que todo proyecto necesita: autenticación, un generador de consultas de base de datos fluido, limpieza de entradas, envío de correo, CAPTCHA y generación de mapas del sitio, deliberadamente separada del motor de enrutamiento para que cada mitad pueda evolucionar de forma independiente.
URLs optimizadas para SEO
Cada URL es compatible con motores de búsqueda por defecto: .htaccess reescribe rutas limpias como /en/blog/show/42 directamente hacia tu controlador, sin desorden de cadenas de consulta. Para contenido que merece una URL legible - el título de un blog, el nombre de un producto - _s() y slugId() combinan el id de una fila con un título convertido en slug en un solo segmento de ruta (.../blog/show/42-hello-world); solo el id se compara jamás, así que el enlace sigue funcionando incluso después de cambiar el título. SunSitemap, parte de la biblioteca de clases Sun*, genera sitemap.xml, sitemap-index.xml y robots.txt directamente a partir de tus rutas, para que los motores de búsqueda puedan rastrear e indexar tu proyecto sin herramientas adicionales.
Documentado, carpeta por carpeta
Cada carpeta estructural del sistema - Core, System, App/Controllers, App/Models, App/Views, App/Lang y Public - se entrega con su propio README.md que explica exactamente qué hay allí y cómo ampliarlo, con ejemplos reales extraídos del propio código funcional de esta plantilla, no fragmentos hipotéticos.
Diseñado para la programación asistida por IA
SunMvc está diseñado para ser leído por herramientas de codificación con IA, no solo por humanos: abre la carpeta del proyecto en un editor como VS Code, apunta un asistente de IA - Claude, GitHub Copilot, Cursor, Windsurf, Gemini CLI - hacia ella, deja que lea los archivos README.md repartidos por el árbol de carpetas, y luego describe el sistema que quieres construir. Puede montar tu idea directamente sobre la base de SunMvc ya abierta en tu espacio de trabajo.
Un generador de consultas, cualquier base de datos
Cada llamada a la base de datos en SunMvc pasa por una única clase construida a mano, SunDB: un solo generador de consultas fluido que habla MySQL, MSSQL y SQLite por igual. Cambia el controlador en un solo array de configuración y todo sigue funcionando exactamente igual que antes: select()/insert()/update()/delete(), paginate() para resultados paginados, backup() para un volcado SQL con un solo comando, maintenance() para analizar/verificar/optimizar/reparar cada tabla, además de transacciones y ayudantes de joins - sin reescribir consultas ni rutas de código separadas por controlador.
Listo para SEO, GEO, AIO, SGE, LLMO y AEO
Esta página está diseñada para una compatibilidad total con SEO (Search Engine Optimization), GEO (Generative Engine Optimization), AIO (Artificial Intelligence Optimization), SGE (Search Generative Experience), LLMO (Large Language Model Optimization) y AEO (Answer Engine Optimization): un sitemap.xml etiquetado con hreflang y URLs canónicas para la búsqueda tradicional, un robots.txt que da la bienvenida explícitamente a GPTBot, ClaudeBot, PerplexityBot y otros rastreadores de IA, un resumen llms.txt escrito para agentes de IA, y datos estructurados JSON-LD que permiten a los motores de respuesta extraer hechos precisos en lugar de analizar texto.
Empezar
Clona la plantilla, copia .env.example a .env con credenciales reales de base de datos, importa el esquema y elige qué idiomas soportar. No hay paso de compilación ni archivo de bloqueo de gestor de paquetes que pelear: un flujo de autenticación funcional y un sistema i18n totalmente conectado están presentes desde la primera solicitud.
Descargar en GitHub