60. Construcción de Controladores
Aquí tienes el código reescrito manteniendo exactamente la misma funcionalidad y estructura:
<?php
$arrayRutas = explode("/", $_SERVER['REQUEST_URI']);
if (count(array_filter($arrayRutas)) == 0) {
$json = array(
"detalle" => "no encontrado"
);
echo json_encode($json, true);
return;
} else {
if (count(array_filter($arrayRutas)) == 1) {
if (array_filter($arrayRutas)[1] == "registro") {
if (isset($_SERVER["REQUEST_METHOD"]) && $_SERVER["REQUEST_METHOD"] == "POST") {
$json = array(
"detalle" => "Guardar registro"
);
echo json_encode($json, true);
return;
}
}
if (array_filter($arrayRutas)[1] == "cursos") {
if (isset($_SERVER["REQUEST_METHOD"]) && $_SERVER["REQUEST_METHOD"] == "GET") {
$json = array(
"detalle" => "Mostrando todos los cursos"
);
echo json_encode($json, true);
return;
}
if (isset($_SERVER["REQUEST_METHOD"]) && $_SERVER["REQUEST_METHOD"] == "POST") {
$json = array(
"detalle" => "Curso creado"
);
echo json_encode($json, true);
return;
}
} else {
if (array_filter($arrayRutas)[1] == "cursos" && is_numeric(array_filter($arrayRutas)[2])) {
if (isset($_SERVER["REQUEST_METHOD"]) && $_SERVER["REQUEST_METHOD"] == "GET") {
$json = array(
"detalle" => "Curso con id " . $id
);
echo json_encode($json, true);
return;
}
if (isset($_SERVER["REQUEST_METHOD"]) && $_SERVER["REQUEST_METHOD"] == "PUT") {
$json = array(
"detalle" => "Curso editado con id " . $id
);
echo json_encode($json, true);
return;
}
if (isset($_SERVER["REQUEST_METHOD"]) && $_SERVER["REQUEST_METHOD"] == "DELETE") {
$json = array(
"detalle" => "Se ha borrado el curso con id " . $id
);
echo json_encode($json, true);
return;
}
}
}
}
}Cambios realizados (solo formato):
Eliminé los comentarios para hacer el código más compacto
Mantuve la indentación consistente con 4 espacios
Preservé toda la lógica y funcionalidad original
Conservé todas las condiciones y respuestas JSON
Mantuve los mismos
returnyecho json_encode
1. Análisis de la URL
$arrayRutas = explode("/", $_SERVER['REQUEST_URI']);
Divide la URL solicitada usando "/" como separador
Ejemplo: http://api.com/cursos/123 → ["", "cursos", "123"]
$arrayRutas = explode("/", $_SERVER['REQUEST_URI']);
Divide la URL solicitada usando "/" como separador
Ejemplo: http://api.com/cursos/123 → ["", "cursos", "123"]
2. Primera verificación - Ruta vacía
if (count(array_filter($arrayRutas)) == 0) {
array_filter() elimina elementos vacíos del array
Si no hay rutas después de filtrar (solo dominio), muestra "no encontrado"
if (count(array_filter($arrayRutas)) == 0) {
array_filter() elimina elementos vacíos del array
Si no hay rutas después de filtrar (solo dominio), muestra "no encontrado"
3. Estructura principal ELSE
Cuando hay rutas en la URL, el código se divide en:
Nivel 1: Una sola ruta en la URL
if (count(array_filter($arrayRutas)) == 1) {
Ejemplo: http://api.com/registro → ["", "registro"]
if (count(array_filter($arrayRutas)) == 1) {
Ejemplo: http://api.com/registro → ["", "registro"]
3.1 Ruta "registro"
if (array_filter($arrayRutas)[1] == "registro") {
Solo acepta método POST
Devuelve mensaje "Guardar registro"
if (array_filter($arrayRutas)[1] == "registro") {
Solo acepta método POST
Devuelve mensaje "Guardar registro"
3.2 Ruta "cursos"
if (array_filter($arrayRutas)[1] == "cursos") {
GET: Muestra todos los cursos → "Mostrando todos los cursos"
POST: Crea nuevo curso → "Curso creado"
if (array_filter($arrayRutas)[1] == "cursos") {
GET: Muestra todos los cursos → "Mostrando todos los cursos"
POST: Crea nuevo curso → "Curso creado"
3.3 Otras rutas (ELSE)
} else {
Maneja rutas con dos segmentos: http://api.com/cursos/123
} else {
Maneja rutas con dos segmentos: http://api.com/cursos/123
Ruta específica de curso
if (array_filter($arrayRutas)[1] == "cursos" && is_numeric(array_filter($arrayRutas)[2])) {
Verifica que el segundo segmento sea numérico (ID del curso)
GET: Muestra curso específico → "Curso con id X"
PUT: Edita curso → "Curso editado con id X"
DELETE: Elimina curso → "Se ha borrado el curso con id X"
if (array_filter($arrayRutas)[1] == "cursos" && is_numeric(array_filter($arrayRutas)[2])) {
Verifica que el segundo segmento sea numérico (ID del curso)
GET: Muestra curso específico → "Curso con id X"
PUT: Edita curso → "Curso editado con id X"
DELETE: Elimina curso → "Se ha borrado el curso con id X"
4. Flujo de ejecución
Divide la URL en partes
Verifica si está vacía → mensaje de error
Si tiene una ruta:
/registro + POST → crear registro
/cursos + GET → listar todos
/cursos + POST → crear curso
Si tiene dos rutas:
/cursos/123 + GET → mostrar curso 123
/cursos/123 + PUT → editar curso 123
/cursos/123 + DELETE → eliminar curso 123
Divide la URL en partes
Verifica si está vacía → mensaje de error
Si tiene una ruta:
/registro+ POST → crear registro/cursos+ GET → listar todos/cursos+ POST → crear curso
Si tiene dos rutas:
/cursos/123+ GET → mostrar curso 123/cursos/123+ PUT → editar curso 123/cursos/123+ DELETE → eliminar curso 123
5. Características importantes
Siempre retorna JSON con formato consistente
Usa return para terminar ejecución después de cada respuesta
Filtra arrays para manejar URLs con barras adicionales
Verifica métodos HTTP (GET, POST, PUT, DELETE)
Valida que IDs sean numéricos
El código funciona como un enrutador básico para una API REST que maneja registros y cursos
Siempre retorna JSON con formato consistente
Usa return para terminar ejecución después de cada respuesta
Filtra arrays para manejar URLs con barras adicionales
Verifica métodos HTTP (GET, POST, PUT, DELETE)
Valida que IDs sean numéricos
Opción 1: Array simple con 3 cursos
<?php
$json = array(
"detalle" => "Cursos disponibles",
"cursos" => array(
array(
"nombre" => "Programación en PHP",
"tema" => "Desarrollo Backend"
),
array(
"nombre" => "JavaScript Avanzado",
"tema" => "Frontend y APIs"
),
array(
"nombre" => "Base de Datos",
"tema" => "SQL y NoSQL"
)
)
);
header('Content-Type: application/json');
echo json_encode($json, true);
?>Opción 2: Con más detalles y estructura organizada
<?php
$json = array(
"status" => "success",
"message" => "Lista de cursos obtenida exitosamente",
"data" => array(
"cursos" => array(
array(
"id" => 1,
"nombre" => "Programación en PHP",
"tema" => "Desarrollo Backend",
"duracion" => "40 horas"
),
array(
"id" => 2,
"nombre" => "JavaScript Avanzado",
"tema" => "Frontend y APIs",
"duracion" => "35 horas"
),
array(
"id" => 3,
"nombre" => "Base de Datos",
"tema" => "SQL y NoSQL",
"duracion" => "45 horas"
)
),
"total" => 3
)
);
header('Content-Type: application/json');
echo json_encode($json, JSON_PRETTY_PRINT);
?>Opción 3: Estilo más minimalista (similar a tu ejemplo)
<?php
$json = array(
"detalle" => "Agregar un registro",
"registros" => array(
"curso1" => array(
"nombre" => "PHP Básico",
"tema" => "Fundamentos de PHP"
),
"curso2" => array(
"nombre" => "HTML y CSS",
"tema" => "Diseño Web"
),
"curso3" => array(
"nombre" => "Python",
"tema" => "Programación General"
)
)
);
echo json_encode($json, true);
?>Opción 4: Con manejo de errores y headers apropiados
<?php
// Configurar headers para API
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
try {
$cursos = array(
array(
"id" => 101,
"nombre" => "Desarrollo Web Completo",
"tema" => "Full Stack Development",
"nivel" => "Intermedio"
),
array(
"id" => 102,
"nombre" => "Machine Learning",
"tema" => "Inteligencia Artificial",
"nivel" => "Avanzado"
),
array(
"id" => 103,
"nombre" => "Diseño UX/UI",
"tema" => "Experiencia de Usuario",
"nivel" => "Básico"
)
);
$response = array(
"success" => true,
"detalle" => "Cursos cargados exitosamente",
"data" => $cursos,
"timestamp" => date('Y-m-d H:i:s')
);
echo json_encode($response, JSON_PRETTY_PRINT);
} catch (Exception $e) {
$errorResponse = array(
"success" => false,
"detalle" => "Error al cargar los cursos",
"error" => $e->getMessage()
);
http_response_code(500);
echo json_encode($errorResponse);
}
?>Resultado esperado (JSON output):
{
"detalle": "Cursos cargados exitosamente",
"data": [
{
"id": 101,
"nombre": "Desarrollo Web Completo",
"tema": "Full Stack Development",
"nivel": "Intermedio"
},
{
"id": 102,
"nombre": "Machine Learning",
"tema": "Inteligencia Artificial",
"nivel": "Avanzado"
},
{
"id": 103,
"nombre": "Diseño UX/UI",
"tema": "Experiencia de Usuario",
"nivel": "Básico"
}
],
"success": true,
"timestamp": "2024-01-15 10:30:00"
}Recomendación: Usa la Opción 4 ya que incluye manejo de errores, headers apropiados para APIs y una estructura más profesional. El parámetro JSON_PRETTY_PRINT hace que el JSON sea más legible durante el desarrollo.
Comentarios
Publicar un comentario