Blog de programación, errores, soluciones

Chose Language:
Author: Admin/Publisher |finished | checked

Enrutamiento en PHP

El enrutamiento en PHP es la práctica de definir cómo las URL se asociarán con acciones que haremos en nuestra aplicación web. Esto es bueno cuando estamos utilizando el patrón de diseño MVC por ejemplo: entro a la página principal /, llamo al controlador que definirá que mostraré, una landing page, una introducción o talvez una lista de los últimos temas.

Este tema probablemente no lo vea en la página oficial de PHP u otros lugares que traten sobre PHP, pero sí lo verá en sus Frameworks. Creo que la primera vez que vi sobre esto fue en un libro sobre Modern PHP o algo por el estilo.

¿Recuerdas esta imagen de MVC?

Talvez te estarás preguntando ¿cómo siempre pasa lo que escribamos en nuestro navegador(browser) por index.php cuando utilizamos un MVC de un framework?

Redireccionamiento a Index.php

Esto sucede cuando cambiamos el archivo .htaccess o lo definimos el comportamiento para redireccionar en nuestro servidor para que redirija a index.php

.htaccess
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /index.php [L,QSA]

Estas reglas de reescritura comúnmente se utilizan para redirigir todas las solicitudes que no corresponden a archivos o directorios existentes a un archivo index.php, que generalmente es el punto de entrada de la aplicación web. Esto es típico en el enrutamiento basado en controladores de frameworks PHP.

Pero antes, para simular un servidor real deberíamos crear un virtual host si deseas hacer esto puedes informarte más en https://blastcoding.com/configuracion-de-virtual-host-en-apache-windows/ en dicho post se usa el Apache que posee XAMPP para crear un virtual host.

Si no hiciéramos este virtual host cuando llevamos todo al index nos mostrará el localhost dashboard.

Rutas

Una vez tengamos nuestro host podremos hacer nuestro index.php pero que tiene nuestro index.php para poder enrutar.

Pues lo primero que necesitar el index son rutas: la manera más simple de hacer estas es con un array, hay otras maneras de hacer rutas.

¿Que deben contener nuestras rutas?

Primero que nada debe tener la ruta que pondremos en el navegador y segundo a donde dirigirá esta ruta, por ejemplo:

$routes = [
    "/" => "PageController/index",
    "patita" =>"PageController/patita",
    "/user/register" => "UserController/register"
];

Enrutamiento

¿Y como sé que una ruta está siendo usada? ¿Cómo obtengo la ruta que he escrito en el browser?

Para esto tendremos que utilizar $_SERVER["REQUEST_URI"] si yo hago lo siguiente:

Obteniendo la ruta pasada
//supongamos que mi virtualhost es miproyecto.local
//si le pasamos miproyecto.local/pepe/www
echo "<p>".$_SERVER["REQUEST_URI"]."<p>";
/pepe/www// mostrara en pantalla
Algo que tenemos que observar aquí es que la ruta comienza con / por tanto, todas las rutas deberian empezar con / en mi array $routes la ruta patita no funcionara

Esto es la URI que acabo de pasar, ahora debería poder procesarla, para ello podríamos verificar que la ruta existe antes con array_key_exists:

verificando que la ruta existe
$route_key = array_key_exists($URI,$routes);
if($route_key){
    echo "existe";
    //codigo para procesar la ruta
}else{
    echo "No exite: mandar a una pagina 404 o cargar una view que presente pagina no encontrada";
    //header('Location: 404.php');
}

Tratemos de hacer un enrutamiento simple sin el patrón de diseño MVC, cambiemos un poco las rutas:

Ejemplo
$routes = [
    "/" => "PageController/index",
    "/patita" =>"PageController/index",
    "/user/register" => "UserController/register",
    "/dashboard" =>"dashboard.php"
];

$URI = make_URI_valid($_SERVER["REQUEST_URI"]); 

$route_key = array_key_exists($URI,$routes);
if($route_key){
    header("Location: ".$routes[$URI]."");
}else{
    header('Location: 404.php');
}

Creamos 2 archivos simples dashboard.php y 404.php y nuestras rutas ya deberían funcionar, la función make_URI_valid es una función que cree para que las rutas sean consistentes para cuando no hay ruta agregue /

De esta manera es como funcionan los frameworks por detrás, todos tienen una redirección, rutas que dependerá del framework que use será como serán definidas, estas rutas serán procesadas de alguna manera, generalmente llevándolo a un controlador o una clase Controller que dirá qué controlador usar

Aquí tenemos otra manera de hacer el enrutamiento https://gist.github.com/shinigamicorei7/8cccbcfc9eb6f234d8d8 en este caso estan realizando el enrutamiento con una clase. Tenga en cuenta que en este post queremos que sepa como funciona un enrutamiento.

Generalmente utilizaras enrutamientos pertenecientes a un Framework

Ejercicios

Ejercicio 1:

Utiliza un enrutamiento que sea un paquete de terceros como puede ser el de Symfony u otro, también puedes hacer y un MVC a partir de este.

Ejercicio 2:

Haz tu propio enrutamiento a partir de este y Haz una web que utilize el patrón de diseño MVC sencillo, o por lo menos la parte de controlador. Este ejercicio puede ser desafiante, pero hará trabajar tu cabeza.

TIPS:

Necesitarás saber de Namespaces, Composer y Composer autoload para poder completar los ejercicios, aquí tienes los links si necesitas repasar estos temas:

También necesitarás saber sobre algunas funciones de array y funciones variables. Pero puede que la publicación sobre $$ le sea más de utilidad: variables, funciones y objetos variables en PHP

Category: php
Something wrong? If you found an error or mistake in the content you can contact me on Twitter | @luisg2249_luis.
Last 4 post in same category