60. Construcción de Controladores

Aquí tienes el código reescrito manteniendo exactamente la misma funcionalidad y estructura:

php
<?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):

  1. Eliminé los comentarios para hacer el código más compacto

  2. Mantuve la indentación consistente con 4 espacios

  3. Preservé toda la lógica y funcionalidad original

  4. Conservé todas las condiciones y respuestas JSON

  5. Mantuve los mismos return y echo json_encode

1. Análisis de la URL

php
$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

php
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

php
if (count(array_filter($arrayRutas)) == 1) {
  • Ejemplo: http://api.com/registro → ["", "registro"]

3.1 Ruta "registro"

php
if (array_filter($arrayRutas)[1] == "registro") {
  • Solo acepta método POST

  • Devuelve mensaje "Guardar registro"

3.2 Ruta "cursos"

php
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)

php
} else {
  • Maneja rutas con dos segmentos: http://api.com/cursos/123

Ruta específica de curso

php
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

  1. Divide la URL en partes

  2. Verifica si está vacía → mensaje de error

  3. Si tiene una ruta:

    • /registro + POST → crear registro

    • /cursos + GET → listar todos

    • /cursos + POST → crear curso

  4. 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


Opción 1: Array simple con 3 cursos

php
<?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
<?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
<?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
<?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):

json
{
    "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

Entradas más populares de este blog

Api-60-2

Te ayudo a crear una API muy sencilla en PHP utilizando esos datos