5-mvc
ARCHIVOS DEL SISTEMA MVC
1. Archivo: controllers/controller.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
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
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
<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
// Línea problemática en controller.php
$enlacesController = $_GET["action"]; // Si no existe 'action' en la URLError 2: Undefined variable: module
// Línea problemática en model.php
return $module; // Si ninguna condición se cumple, $module no se defineError 3: Filename cannot be empty
// Línea problemática en controller.php
include $respuesta; // Si $respuesta está vacía🛠️ PASO 2: CORREGIR EL CONTROLADOR
Antes (PROBLEMÁTICO):
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):
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):
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):
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:
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):
<li><a href="index.php">Inicio</a></li>
<!-- ❌ Al hacer clic aquí, no se pasa parámetro 'action' -->Después (CORREGIDO):
<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
// 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
<!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>© <?php echo date('Y'); ?> Todos los derechos reservados</p>
</footer>
</body>
</html>📁 PASO 7: CREAR LAS VISTAS (modules/)
views/modules/inicio.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
<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
<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
<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
URL: http://localhost/cursoPHP/03.MVC/index.php
Resultado: Debe mostrar la página de inicioPrueba 2: Acceder con parámetro válido
URL: http://localhost/cursoPHP/03.MVC/index.php?action=servicios
Resultado: Debe mostrar la página de serviciosPrueba 3: Acceder con parámetro inválido
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:
Undefined index actionCausa: Intentar acceder a
$_GET["action"]sin verificar si existeSolución: Usar
isset($_GET["action"])antes de acceder
Undefined variable: moduleCausa: La variable
$moduleno se inicializa en todos los casosSolución: Inicializar la variable al inicio o añadir cláusula
else
Filename cannot be emptyCausa: Intentar incluir un archivo con nombre vacío
Solución: Verificar que
$respuestano esté vacía antes de incluir
🚀 MEJORAS ADICIONALES RECOMENDADAS
1. Sistema de rutas mejorado:
// 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:
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):
# .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:
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.phpEnlaces correctos para probar:
http://localhost/03.MVC/index.php→ Página de iniciohttp://localhost/03.MVC/index.php?action=inicio→ Página de iniciohttp://localhost/03.MVC/index.php?action=nosotros→ Nosotroshttp://localhost/03.MVC/index.php?action=servicios→ Servicioshttp://localhost/03.MVC/index.php?action=contactenos→ Contáctenoshttp://localhost/03.MVC/index.php?action=cualquiercosa→ Inicio (por defecto)
📚 CONSEJOS FINALES
Siempre validar datos de entrada (GET, POST, etc.)
Inicializar variables antes de usarlas
Verificar existencia de archivos antes de incluirlos
Usar valores por defecto para casos inesperados
Implementar logs de errores para depuración
Separar lógica de presentación (HTML/PHP)
Comentarios
Publicar un comentario