50. Como pasar parámetros a una ruta PHP

Va a haber ocasiones en las que vamos a tener que pasar información a nuestra aplicación pero desde la URL. En este capítulo vamos a aprender a pasar una URL descriptiva de la información que se va a mostrar en pantalla. Para ello vamos a trabajar en el archivo web.php dentro de la carpeta routes.

Incluimos la sintaxis sobre los dos archivos que hemos trabajado en este curso, el archivo Routes.php y el archivo web.php.

lib/Route.php

<?php

namespace Lib;

class Route
{
  private static $routes = [];

  // Método encargado de agregar rutas GET
  public static function get($uri, $callback){
    $uri = trim($uri, "/");
    self::$routes['GET'][$uri] = $callback;
  }

  // Método encargado de agregar rutas POST
  public static function post($uri, $callback){
    $uri = trim($uri, "/");
    self::$routes['POST'][$uri] = $callback;
  }
 
  // Método para recuperar la URI y el método
  public static function dispatch() {
    $uri = $_SERVER['REQUEST_URI'];
    $uri = trim($uri, "/");

    // Variable que nos mostrará el método que hemos utilizado
    $method = $_SERVER['REQUEST_METHOD'];

    foreach(self::$routes[$method] as $route => $callback){

      if(strpos($route, ':') !== false){
        $route = preg_replace('#:[a-zA-Z]+#', '([a-zA-Z]+)', $route,);
      }

      if(preg_match("#^$route$#", $uri , $matches)){
        $params = array_slice($matches, 1);
       
        $response = $callback(...$params);

        if(is_array($response) || is_object($response)){
          header('Content-Type: application/json');
         
          echo json_encode($response);
        } else {
          echo $response;
        }

        return;
      }
    }
    echo "404 Not Found";
  }
}

 

routes/web.php

<?php

use Lib\Route;

Route::get('/', function(){
  return [
    'title' => 'Home',
    'content' => 'Hola desde la página de Inicio'
  ];
});

Route::get('/contact', function(){
  return 'Hola desde la página de contacto';
});

Route::get('/about', function(){
  return 'Hola desde la página de acerca de';
});

Route::get('/courses/:slug', function($slug){
  return "El curso es: " . $slug;
});

Route::dispatch();