5-mvc

 

ARCHIVOS DEL SISTEMA MVC

1. Archivo: controllers/controller.php

php
<?php
class MvcController {
    
    # LLAMADA A LA PLANTILLA
    public function plantilla(){
        # include() Se utiliza para invocar el archivo que contiene código html
        include "views/template.php";
    }

    # INTERACCIÓN DEL USUARIO
    public function enlacesPaginasController(){
        if(isset($_GET["action"])){
            $enlacesController = $_GET["action"];
        }
        else{
            $enlacesController = "index.php";
        }
        $respuesta = EnlacesPaginas::enlacesPaginasModel($enlacesController);
        include $respuesta;
    }
}
?>

2. Archivo: models/model.php (Versión con problemas)

php
<?php
class EnlacesPaginas{
    public function enlacesPaginasModel($enlacesModel){
        if($enlacesModel == "nosotros" || 
           $enlacesModel == "servicios" || 
           $enlacesModel == "contactenos"){
            
            $module = "views/modules/".$enlacesModel.".php";
        }
        else if($enlacesModel == "index"){
            $module = "views/modules/inicio.php";
        }
        return $module;
    }
}
?>

3. Archivo: models/model.php (Versión corregida)

php
<?php
class EnlacesPaginas{
    public function enlacesPaginasModel($enlacesModel){
        if($enlacesModel == "nosotros" || 
           $enlacesModel == "servicios" || 
           $enlacesModel == "contactenos"){
            
            $module = "views/modules/".$enlacesModel.".php";
        }
        else if($enlacesModel == "index"){
            $module = "views/modules/inicio.php";
        }
        else {
            $module = "views/modules/inicio.php";
        }
        
        return $module;
    }
}
?>

4. Archivo: views/modules/navegacion.php

html
<nav>
    <ul>
        <li><a href="index.php">Inicio</a></li>
        <li><a href="index.php?action=nosotros">Nosotros</a></li>
        <li><a href="index.php?action=servicios">Servicios</a></li>
        <li><a href="index.php?action=contactenos">Contáctenos</a></li>
    </ul>
</nav>

🎯 TUTORIAL: SOLUCIONANDO ERRORES EN MVC PHP

📖 PASO 1: IDENTIFICAR LOS ERRORES

Error 1: Undefined index action

php
// Línea problemática en controller.php
$enlacesController = $_GET["action"]; // Si no existe 'action' en la URL

Error 2: Undefined variable: module

php
// Línea problemática en model.php
return $module; // Si ninguna condición se cumple, $module no se define

Error 3: Filename cannot be empty

php
// Línea problemática en controller.php
include $respuesta; // Si $respuesta está vacía

🛠️ PASO 2: CORREGIR EL CONTROLADOR

Antes (PROBLEMÁTICO):

php
public function enlacesPaginasController(){
    if(isset($_GET["action"])){
        $enlacesController = $_GET["action"];
    }
    else{
        $enlacesController = "index.php"; // ❌ ERROR: Debe ser "inicio" o "index"
    }
    $respuesta = EnlacesPaginas::enlacesPaginasModel($enlacesController);
    include $respuesta;
}

Después (CORREGIDO):

php
public function enlacesPaginasController(){
    // Verificar si existe el parámetro 'action'
    if(isset($_GET["action"])){
        $enlacesController = $_GET["action"];
    } else {
        // Valor por defecto cuando no hay parámetro
        $enlacesController = "inicio"; // ✅ CORRECTO: Usar "inicio"
    }
    
    // Obtener la ruta del archivo desde el modelo
    $respuesta = EnlacesPaginas::enlacesPaginasModel($enlacesController);
    
    // Verificar que la ruta no esté vacía antes de incluir
    if(!empty($respuesta)){
        include $respuesta;
    } else {
        // Página de error o página por defecto
        include "views/modules/inicio.php";
    }
}

🛠️ PASO 3: CORREGIR EL MODELO

Antes (PROBLEMÁTICO):

php
public function enlacesPaginasModel($enlacesModel){
    if($enlacesModel == "nosotros" || 
       $enlacesModel == "servicios" || 
       $enlacesModel == "contactenos"){
        $module = "views/modules/".$enlacesModel.".php";
    }
    else if($enlacesModel == "index"){
        $module = "views/modules/inicio.php";
    }
    // ❌ PROBLEMA: Si $enlacesModel no coincide con nada, $module no se define
    return $module;
}

Después (CORREGIDO - Versión 1):

php
public function enlacesPaginasModel($enlacesModel){
    // Inicializar la variable
    $module = "views/modules/inicio.php"; // Valor por defecto
    
    if($enlacesModel == "nosotros" || 
       $enlacesModel == "servicios" || 
       $enlacesModel == "contactenos"){
        $module = "views/modules/".$enlacesModel.".php";
    }
    else if($enlacesModel == "index" || 
            $enlacesModel == "inicio"){
        $module = "views/modules/inicio.php";
    }
    // ✅ Ahora $module siempre tiene un valor
    return $module;
}

Versión Mejorada:

php
public function enlacesPaginasModel($enlacesModel){
    // Lista de páginas permitidas
    $paginasPermitidas = [
        "inicio",
        "nosotros", 
        "servicios", 
        "contactenos"
    ];
    
    // Si la página está en la lista permitida
    if(in_array($enlacesModel, $paginasPermitidas)){
        // Verificar si el archivo existe
        $rutaArchivo = "views/modules/" . $enlacesModel . ".php";
        if(file_exists($rutaArchivo)){
            return $rutaArchivo;
        }
    }
    
    // Página por defecto si no se encuentra
    return "views/modules/inicio.php";
}

🛠️ PASO 4: CORREGIR LA NAVEGACIÓN

Antes (PROBLEMÁTICO):

html
<li><a href="index.php">Inicio</a></li>
<!-- ❌ Al hacer clic aquí, no se pasa parámetro 'action' -->

Después (CORREGIDO):

html
<nav>
    <ul>
        <!-- ✅ Ahora todas las páginas pasan el parámetro 'action' -->
        <li><a href="index.php?action=inicio">Inicio</a></li>
        <li><a href="index.php?action=nosotros">Nosotros</a></li>
        <li><a href="index.php?action=servicios">Servicios</a></li>
        <li><a href="index.php?action=contactenos">Contáctenos</a></li>
    </ul>
</nav>

🛠️ PASO 5: ARCHIVO index.php COMPLETO

php
<?php
// Incluir los archivos necesarios
require_once "controllers/controller.php";
require_once "models/model.php";

// Crear instancia del controlador
$mvc = new MvcController();

// Cargar la plantilla principal
$mvc->plantilla();
?>

🛠️ PASO 6: ARCHIVO template.php COMPLETO

php
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Sistema MVC</title>
</head>
<body>
    <header>
        <h1>LOGOTIPO</h1>
    </header>

    <?php include "modules/navegacion.php"; ?>

    <section>
        <?php
        // Crear instancia y cargar contenido dinámico
        $mvc = new MvcController();
        $mvc->enlacesPaginasController();
        ?>
    </section>

    <footer>
        <p>&copy; <?php echo date('Y'); ?> Todos los derechos reservados</p>
    </footer>
</body>
</html>

📁 PASO 7: CREAR LAS VISTAS (modules/)

views/modules/inicio.php

php
<h1>PÁGINA DE INICIO</h1>
<p>Bienvenido a nuestro sitio web.</p>
<p>Selecciona una opción del menú para navegar.</p>

views/modules/nosotros.php

php
<h1>SOBRE NOSOTROS</h1>
<p>Somos una empresa dedicada al desarrollo web.</p>
<p>Especialistas en PHP y sistemas MVC.</p>

views/modules/servicios.php

php
<h1>NUESTROS SERVICIOS</h1>
<table border="1">
    <tr>
        <th>Servicio</th>
        <th>Descripción</th>
    </tr>
    <tr>
        <td>Desarrollo Web</td>
        <td>Creación de sitios y aplicaciones web</td>
    </tr>
    <tr>
        <td>Consultoría</td>
        <td>Asesoramiento en tecnología</td>
    </tr>
</table>

views/modules/contactenos.php

php
<h1>CONTÁCTENOS</h1>
<form action="#" method="post">
    <p>
        <label>Nombre:</label><br>
        <input type="text" name="nombre">
    </p>
    <p>
        <label>Email:</label><br>
        <input type="email" name="email">
    </p>
    <p>
        <label>Mensaje:</label><br>
        <textarea name="mensaje"></textarea>
    </p>
    <p>
        <input type="submit" value="Enviar">
    </p>
</form>

🔍 PASO 8: PROBAR EL SISTEMA PASO A PASO

Prueba 1: Acceder sin parámetros

text
URL: http://localhost/cursoPHP/03.MVC/index.php
Resultado: Debe mostrar la página de inicio

Prueba 2: Acceder con parámetro válido

text
URL: http://localhost/cursoPHP/03.MVC/index.php?action=servicios
Resultado: Debe mostrar la página de servicios

Prueba 3: Acceder con parámetro inválido

text
URL: http://localhost/cursoPHP/03.MVC/index.php?action=otrapagina
Resultado: Debe mostrar la página de inicio (por defecto)

📊 RESUMEN DE CORRECCIONES

ERRORES ORIGINALES Y SOLUCIONES:

  1. Undefined index action

    • Causa: Intentar acceder a $_GET["action"] sin verificar si existe

    • Solución: Usar isset($_GET["action"]) antes de acceder

  2. Undefined variable: module

    • Causa: La variable $module no se inicializa en todos los casos

    • Solución: Inicializar la variable al inicio o añadir cláusula else

  3. Filename cannot be empty

    • Causa: Intentar incluir un archivo con nombre vacío

    • Solución: Verificar que $respuesta no esté vacía antes de incluir


🚀 MEJORAS ADICIONALES RECOMENDADAS

1. Sistema de rutas mejorado:

php
// En el controlador
private $rutas = [
    'inicio' => 'views/modules/inicio.php',
    'nosotros' => 'views/modules/nosotros.php',
    'servicios' => 'views/modules/servicios.php',
    'contactenos' => 'views/modules/contactenos.php'
];

public function cargarVista($vista){
    if(array_key_exists($vista, $this->rutas)){
        return $this->rutas[$vista];
    }
    return $this->rutas['inicio'];
}

2. Manejo de errores más robusto:

php
public function enlacesPaginasController(){
    try {
        $accion = $_GET['action'] ?? 'inicio';
        $ruta = EnlacesPaginas::enlacesPaginasModel($accion);
        
        if(file_exists($ruta)){
            include $ruta;
        } else {
            throw new Exception("Vista no encontrada: $ruta");
        }
    } catch(Exception $e){
        // Registrar error
        error_log($e->getMessage());
        // Mostrar página de error
        include "views/modules/error.php";
    }
}

3. URLs amigables (usando .htaccess):

apache
# .htaccess en la raíz
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9/-]+)$ index.php?action=$1 [QSA,L]

✅ VERSIÓN FINAL CORREGIDA

Estructura del proyecto funcionando:

text
03.MVC/
├── index.php                      # Punto de entrada
├── .htaccess                      # (Opcional) URLs amigables
├── controllers/
│   └── controller.php             # Controlador corregido
├── models/
│   └── model.php                  # Modelo corregido
└── views/
    ├── template.php               # Plantilla principal
    └── modules/
        ├── navegacion.php         # Menú corregido
        ├── inicio.php
        ├── nosotros.php
        ├── servicios.php
        └── contactenos.php

Enlaces correctos para probar:

  • http://localhost/03.MVC/index.php → Página de inicio

  • http://localhost/03.MVC/index.php?action=inicio → Página de inicio

  • http://localhost/03.MVC/index.php?action=nosotros → Nosotros

  • http://localhost/03.MVC/index.php?action=servicios → Servicios

  • http://localhost/03.MVC/index.php?action=contactenos → Contáctenos

  • http://localhost/03.MVC/index.php?action=cualquiercosa → Inicio (por defecto)


📚 CONSEJOS FINALES

  1. Siempre validar datos de entrada (GET, POST, etc.)

  2. Inicializar variables antes de usarlas

  3. Verificar existencia de archivos antes de incluirlos

  4. Usar valores por defecto para casos inesperados

  5. Implementar logs de errores para depuración

  6. Separar lógica de presentación (HTML/PHP)

Comentarios

Entradas más populares de este blog

token

¿Qué es un token y cómo se utiliza en una API?

Generación de Credenciales API