programación

HTTP Routing a través de Laravel

Uno de los fundamentos de cualquier aplicación web es el enrutado de componentes. Por conveniencia usaremos el anglicismo router en vez de enrutador y lo acompañaremos del protocolo básico que permite el routing entre los componentes de nuestra aplicación, el famoso HTTP.

El enrutamiento o routing se refiere a la determinación de como una aplicación responde a una petición de cliente a un punto final particular, que es un URI (o ruta) y un método de solicitud HTTP específico (GET, POST, y así sucesivamente).

Conocer cómo funciona el método de routing en tu framework favorito te provee el mecanismo para crear y modificar las URLs de tu aplicación para que sean más leíbles a los usuarios, mas convenientes a los motores de búsqueda o para proporcionar un URL más corto y/o relevante al momento de enlazar a otras webs o servicios.

La técnica de routing también añade una capa de abstracción entre los archivos que componen la aplicación y la dirección URL que se presenta al mundo exterior. Eso de crear un website o un web application reflejando la estructura de folders y archivos 1-a-1 resulta un poco inconveniente a la hora de crear una web moderna y robusta. En otras palabras el routing nos ayuda a que no se exponga el funcionamiento interno de un sitio web a los usuarios.

Para entender afondo todo esto del routing vamos a definir algunos ejemplos básicos usando como base el framework de Laravel. En Laravel la mayoría del routing se define en el archivo app/Http/routes.php. Cada uno de los ejemplos que usaremos son los ejemplos utilizados en la documentación de Laravel.

Basic Routing

Esta es la manera más básica de crear un URL.

Route::get('/', function () {
    return 'Hello World';
});

Este código se traduce a mostrar la frase “Hello World” en la pagina principal que es equivalente a visitar www.ejemplo.com/index.php. Si deseamos crear una sección o una ruta al login podemos hacerlo de la siguiente manera:

Route::get('login', function () {
    return 'Esto será nuestro login page.';
});

Route Parameters

Si deseamos capturar algún valor de nuestro URL podemos hacerlo de la siguiente manera:

Route::get('user/{id}', function ($id) {
    return 'User '.$id;
});

Este routing se traduce en el siguiente URL, http:///www.ejemplo.com/user/1.
En Laravel podemos definir x cantidad de parámetros según necesitemos.

Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
    //
});

El código anterior se transformaría en algo similiar a http:///www.ejemplo.com/post/1/comments/21.

Habrá momento que vamos a desear que el parámetro sea opcional. Esto lo logramos usando el carácter “?” como parte del parámetro, {name}.

Route::get('user/{name?}', function ($name = null) {
    return $name;
});

Route::get('user/{name?}', function ($name = Jaime) {
    return 'Soy ' . $name;
});

Regular Expression

Si deseamos restringir el valor de los parámetros podemos utilizar un regular expression para tener mayor control. Para aprovechar esta funcionalidad utilizaremos el método where de la instancia del router.

Route::get('user/{name}', function ($name) {
    //
})
->where('name', '[A-Za-z]+');

Muy convenientemente podemos mezclar diferentes tipo de expresiones regulares:

Route::get('user/{id}/{name}', function ($id, $name) {
    //
})
->where(['id' => '[0-9]+', 'name' => '[a-z]+']);

Named Routing

A través de esta técnica podemos crear diferentes URLs y redirigirlas usando otro nombre dentro de nuestra aplicación. Este mecanismo es muy práctico para evitar el trago amargo de tener que cambiar los URLs a través de todo el código de nuestra aplicación. Esto lo logramos pasando un arreglo al segundo argumento en la instancia del router.

Route::get('user/profile', ['as' => 'profile', function()
{
    //
}]);

En este ejemplo nuestro si el URL ‘user/profile’ cambia, no habrá problema porque nuestra aplicación lo conoce como ‘profile’. En nuestro código podemos usar este URL o redireccionar de la siguiente manera:

$url = route('profile');
$redirect = redirect()->route('profile');

Route Groups

Si deseamos aplicar algún atributo que aplique a un grupo de URLs podemos hacerlo a través del método Route::group. En Laravel estos atributos esta reunidos en un arreglo que fácilmente podemos usar en nuestro método. Los atributos disponibles son:

  • Middleware
  • Namespaces
  • Domain
  • Prefix

Middleware

Para aplicar uno o varios middleware a todos nuestros URLs podemos hacerlo listando en un arreglo los nombres de cada uno. Estos se ejecutaran en el orden en que los escribas.

Route::group(['middleware' => ['check1', ' check2']], function()
{
    Route::get('/', function()
    {
        // Has check1 And check2 Middleware
    });

    Route::get('user/profile', function()
    {
        // Has check1 And check2 Middleware
    });

});

Namespaces

Un uso para este método es asignar un namespace a un grupo de controllers. Esto es un excelente mecanismo para mantener nuestro código lo más organizado posible.

Route::group(['namespace' => 'Admin'], function()
{
    // Controllers Within The "App\Http\Controllers\Admin" Namespace

    Route::group(['namespace' => 'User'], function()
    {
        // Controllers Within The "App\Http\Controllers\Admin\User" Namespace
    });
});

Sub-Domain Routing

¿Necesitas trabajar algún sub-dominio? No te preocupes Laravel también proveer un método para esto. Inclusive puedes asignar parámetros a los diferentes URLs.


Route::group(['domain' => '{account}.myapp.com'], function () {
    Route::get('user/{id}', function ($account, $id) {
        //
    });
});

Route Prefixes

Si deseamos aplicar un prefijo a un grupo determinado de URLs podemos hacerlo pasando el prefijo como un arreglo al metodo del router. Veamos el ejemplo:

Route::group(['prefix' => 'admin'], function () {
    Route::get('users', function () {
        // Matches The "/admin/users" URL
    });
});

También podemos usar el prefijo junto al un parámetro para asociar el valor de ese parámetro a un grupo de URLs:

Route::group(['prefix' => 'accounts/{account_id}'], function () {
    Route::get('detail', function ($account_id) {
        // Handles Requests To admin/user
    });
});

Básicamente hemos cubiertos lo básico del HTTP routing en Laravel. Aunque hayamos trabajado el routing directamente en el archivo router.php a traves utilizando Closures lo ideal es que la ruta puede tener una o más funciones de controlador, o sea las rutas deben apuntar a los controladores de nuestra aplicación. De pues de todo la arquitectura de Laravel se basa el modelo MVC.