59-2-Comportamiento con diferentes URLs:2

 <?php


// Procesar la URL y obtener las rutas
$arrayRutas = explode("/", $_SERVER['REQUEST_URI']);
$arrayRutasFiltrado = array_filter($arrayRutas);
$countRutas = count($arrayRutasFiltrado);

// Caso 1: Ninguna petición específica (URL base)
if ($countRutas == 0) {
    $json = [
        "detalle" => "no encontrado"
    ];
    
    echo json_encode($json, true);
    return;
}

// Caso 2: Una sola ruta en la URL
if ($countRutas == 1) {
    $rutaSolicitada = $arrayRutasFiltrado[1];
    
    // Petición a registro
    if ($rutaSolicitada == "registro") {
        // Lógica para registro (pendiente de implementar)
    }
    
    // Petición a cursos
    if ($rutaSolicitada == "cursos") {
        // Lógica para cursos (pendiente de implementar)
    }
    
    // Si ninguna ruta válida coincide dentro del bloque de una ruta
    $json = [
        "detalle" => "no encontrado"
    ];
    echo json_encode($json, true);
    return;
}

// Caso 3: Múltiples rutas o ninguna coincidencia
$json = [
    "detalle" => "no encontrado"
];
echo json_encode($json, true);
return;

Análisis del código:

1. Procesamiento de la URL:

php
$arrayRutas = explode("/", $_SERVER['REQUEST_URI']);

Divide la URL en partes usando "/" como separador.

2. Filtrado del array:

php
$arrayRutasFiltrado = array_filter($arrayRutas);

Elimina elementos vacíos del array (como espacios en blanco).

3. Conteo de rutas:

php
$countRutas = count($arrayRutasFiltrado);

Cuenta cuántos segmentos válidos tiene la URL después del dominio.

Comportamiento con diferentes URLs:

Caso 1: URL base - https://miweb.com

text
$_SERVER['REQUEST_URI'] = "/"
$arrayRutas = ["", ""] → elementos vacíos
$arrayRutasFiltrado = [] → array vacío
$countRutas = 0

Resultado: Muestra "no encontrado"

Caso 2: URL con una ruta - https://midominio.com/cursos

text
$_SERVER['REQUEST_URI'] = "/cursos/"
$arrayRutas = ["", "cursos", ""]
$arrayRutasFiltrado = ["cursos"] → solo el elemento válido
$countRutas = 1

Resultado: Entra en el bloque if ($countRutas == 1) y verifica si es "cursos"

Caso 3: URL con múltiples rutas - https://midominio.com/cursos/123

text
$_SERVER['REQUEST_URI'] = "/cursos/123/"
$arrayRutas = ["", "cursos", "123", ""]
$arrayRutasFiltrado = ["cursos", "123"]
$countRutas = 2

Resultado: No entra en ningún bloque condicional y muestra "no encontrado"

Puntos clave:

  1. $countRutas cuenta solo los segmentos no vacíos de la URL

  2. El código actual solo maneja URLs con exactamente 1 segmento válido

  3. URLs con más de 1 segmento (como /cursos/123) siempre devolverán "no encontrado"

  4. La URL base (solo dominio) siempre tendrá $countRutas = 0

Limitaciones:

El código está incompleto (tiene bloques if vacíos para "registro" y "cursos") y solo maneja rutas de un nivel de profundidad.


Explicación del código:

Este código maneja rutas de una API RESTful con tres niveles:

  1. $countRutas == 0: URL base (https://midominio.com)

  2. $countRutas == 1: Rutas principales (https://midominio.com/cursos)

  3. $countRutas == 2: Rutas con ID (https://midominio.com/cursos/2)

Para la URL https://midominio.com/cursos/2:

text
$_SERVER['REQUEST_URI'] = "/cursos/2/"
$arrayRutas = ["", "cursos", "2", ""]
$arrayRutasFiltrado = ["cursos", "2"] → elementos 1 y 2
$countRutas = 2

Entra en el bloque else if ($countRutas == 2) y verifica:

  • Si el primer elemento es "cursos"

  • Si el segundo elemento es numérico

  • Si el método es GET

Código reescrito y corregido:

php
<?php

// Procesar la URL
$arrayRutas = explode("/", $_SERVER['REQUEST_URI']);
$arrayRutasFiltrado = array_filter($arrayRutas);
$countRutas = count($arrayRutasFiltrado);

// Caso 1: URL base - ninguna petición
if ($countRutas == 0) {
    $json = array(
        "detalle" => "no encontrado"
    );
    
    echo json_encode($json, true);
    return;
}

// Caso 2: Una ruta (ej: /cursos o /registro)
if ($countRutas == 1) {
    $ruta = $arrayRutasFiltrado[1];
    
    if ($ruta == "registro") {
        // Lógica para registro (pendiente)
    }
    
    if ($ruta == "cursos") {
        // Lógica para cursos (pendiente)
    }
}

// Caso 3: Dos rutas (ej: /cursos/2)
if ($countRutas == 2) {
    $ruta = $arrayRutasFiltrado[1];
    $id = $arrayRutasFiltrado[2];
    
    if ($ruta == "cursos" && is_numeric($id)) {
        
        if (isset($_SERVER["REQUEST_METHOD"]) && $_SERVER["REQUEST_METHOD"] == "GET") {
            $json = array(
                "detalle" => "Curso con id " . $id
            );
            echo json_encode($json, true);
            return;
        }
    }
}

// Si no coincide ninguna ruta válida
$json = array(
    "detalle" => "no encontrado"
);
echo json_encode($json, true);
return;

Correcciones y mejoras:

  1. Estructura más clara: Bloques if separados en lugar de else if anidados

  2. Variables descriptivas$ruta e $id para mejor legibilidad

  3. Sintaxis consistente: Todas las estructuras siguen el mismo formato

  4. Mantenimiento de funcionalidad: Mismo comportamiento original

  5. Corrección de lógica: El bloque de 2 rutas ahora está correctamente posicionado

El código mantiene la simplicidad original pero es más fácil de leer y mantener.

Comentarios