Documentación OXIRA Core v1.0.0

Un microframework PHP MVC diseñado para la velocidad, basado en la filosofía de Convención sobre Configuración.

¿Qué NO es OXIRA Core? No es Laravel ni un framework monolítico. No requiere cientos de archivos de configuración ni comandos de terminal. Es código PHP puro y eficiente.

Filosofía del Framework

  • Convención sobre Configuración: Si sigues las reglas de nombres, todo funciona automáticamente.
  • Routing Automático: No existen archivos de rutas. La estructura de carpetas define la URL.
  • Separación Estricta: El código se divide en áreas: Front, Admin, User y Api.
  • Hosting Friendly: Funciona en cualquier servidor compartido con PHP 8.0+.

Instalación

Sigue estos pasos para desplegar el framework en producción o local:

  1. Descarga y descomprime el archivo OXIRA-MicroMVC.zip en la raíz de tu servidor.
  2. Copia el archivo .env.example a .env.
  3. Configura tu base de datos en el archivo .env.
APP_ENV=development
APP_URL=http://localhost/mi-proyecto

DB_HOST=localhost
DB_NAME=oxira_db
DB_USER=root
DB_PASS=

Estructura del Proyecto

El orden es vital. El framework detecta automáticamente las carpetas.

/
├── app/
│   ├── Core/           # Motor del framework (Router, Controller, Model)
│   ├── Controllers/    # Lógica de entrada
│   │   ├── Admin/      # Controladores del panel administrativo
│   │   ├── Api/        # Endpoints JSON
│   │   ├── User/       # Área de cliente logueado
│   │   └── (raiz)      # Controladores públicos (Front)
│   ├── Models/         # Lógica de base de datos
│   └── Views/          # Plantillas HTML
├── config/             # Configuraciones estáticas
├── assets/             # CSS, JS, Imágenes (acceso directo)
├── .env                # Credenciales (Git ignore)
└── index.php           # Punto de entrada único
Regla crítica: Nunca modifiques la carpeta app/Core. El Core se reutiliza entre proyectos. Toda la personalización va en Controllers, Models y Views.

Core del Framework (NO TOCAR)

Regla absoluta:
La carpeta app/Core no debe modificarse bajo ningún motivo. El Core es reutilizable entre proyectos y controla: routing, seguridad, renderizado y errores.

El Core se encarga de:

  • Resolver la URL y detectar el área (Front, Admin, User, Api).
  • Cargar automáticamente el Controller correcto.
  • Aplicar seguridad antes de ejecutar cualquier método.
  • Renderizar vistas y layouts por área.
  • Manejar errores 404 / 403 / 500.

Todo el desarrollo del proyecto debe realizarse únicamente en: Controllers, Models y Views.

Routing Automático

OXIRA Core elimina la necesidad de declarar rutas manualmente. El Router interpreta la URL basándose en segmentos.

Regla de Oro: La URL siempre sigue el patrón: /Area/Controlador/Metodo/Parametros
URL Solicitada Área Controlador (Archivo) Método Params
/ Front HomeController.php index() -
/noticias Front NoticiasController.php index() -
/noticias/ver/15 Front NoticiasController.php ver(15) 15
/admin/ventas Admin Admin/VentasController.php index() -

Subcarpetas y Escalabilidad

OXIRA Core permite crear subcarpetas ilimitadas sin configuración adicional.

Ejemplo:

/admin/settings/currencies/1/edit
↓
Controllers/Admin/Settings/CurrenciesController::edit(1)

Para lograrlo solo debes crear:

app/Controllers/Admin/Settings/CurrenciesController.php
app/Views/admin/settings/currencies/edit.php
No existe límite de niveles.
No se tocan rutas.
No se modifica el Core.

Controladores

Los controladores orquestan la respuesta. Deben extender siempre de la clase base Controller.

Ejemplo: Controlador Público

Archivo: app/Controllers/ProductoController.php

class ProductoController extends Controller
{
    public function index()
    {
        return $this->view('producto/index', [
            'titulo' => 'Listado de Productos'
        ]);
    }

    public function detalle($id)
    {
        if (!$id) {
            $this->redirect('/producto');
        }

        $producto = $this->model('Producto')->find($id);

        return $this->view('producto/detalle', $producto);
    }
}

Ejemplo: Controlador Admin (Protegido)

Archivo: app/Controllers/Admin/DashboardController.php

class DashboardController extends Controller 
{
    public function index() 
    {
        // No necesitas verificar sesión aquí. 
        // El Core protege automáticamente toda la carpeta /Admin
        
        // Carga views/admin/dashboard/home.php
        return $this->view('dashboard/home');
    }
}

Modelos

Los modelos interactúan con la base de datos usando PDO nativo y seguro.

Archivo: app/Models/Usuario.php

class Usuario extends Model 
{
    public function obtenerTodos() 
    {
        return $this->db->query("SELECT * FROM usuarios");
    }

    public function crear($datos) 
    {
        $stmt = $this->db->prepare(
            "INSERT INTO usuarios (nombre, email) VALUES (?, ?)"
        );
        return $stmt->execute([$datos['nombre'], $datos['email']]);
    }
}

Vistas y Layouts

Las vistas se organizan estrictamente por área para evitar mezclar el frontend con el panel de administración.

Ubicación: app/Views/{area}/{carpeta}/{archivo}.php

Estructura recomendada

Views/
├── front/
│   ├── layout.php      # Diseño principal (Header, Footer público)
│   ├── home.php        # Vista de inicio
│   └── partials/       # Fragmentos (nav, sidebar)
├── admin/
│   ├── layout.php      # Diseño del panel (Sidebar admin, Topbar)
│   └── dashboard/
│       └── home.php
└── user/
    └── layout.php

Uso en el archivo de vista

El framework inyecta automáticamente el contenido dentro del layout.php del área.

<!-- app/Views/front/producto/detalle.php -->
<div class="producto-card">
    <h1><?= $data['nombre'] ?></h1>
    <p>Precio: S/ <?= $data['precio'] ?></p>
</div>

Seguridad por Áreas

La seguridad en OXIRA Core es automática y declarativa por carpeta. Se aplica antes de ejecutar cualquier controlador, evitando errores humanos.

Área / Prefijo URL Acceso Comportamiento
/ (Raíz/Front) Público Acceso libre para todos los visitantes.
/admin/* Privado El Core verifica automáticamente una sesión válida. Si no existe sesión activa, redirige al Login.
/user/* Privado Requiere sesión de usuario estándar.
Importante: Si creas un controlador dentro de la carpeta Admin, automáticamente estará protegido. No necesitas agregar lógica de sesión en cada función.

Respuestas JSON (API)

Para devolver datos JSON (para Apps móviles o AJAX), utiliza las cabeceras nativas de PHP.

Archivo: app/Controllers/Api/UsuariosController.php

class UsuariosController extends Controller
{
    public function get($id)
    {
        $data = [
            'status' => 'ok',
            'id' => $id
        ];

        header('Content-Type: application/json; charset=utf-8');
        echo json_encode($data);
        exit;
    }
}