Rutas en Laravel

Las rutas son una de las funcionalidades que Laravel ofrece como carta de presentación y sin duda alguna es muy llamativa. Es muy simple definir rutas con distintos métodos HTTP, grupos de rutas, dividirlas, etc. En este tutorial vamos a conocer algunas características que deberías tomar en cuenta mientras trabajas con rutas en Laravel.

Definir nombres para las rutas

Nuestra aplicación puede estar sujeta a cambios, un ejemplo de esto es que podemos imaginarnos que tenemos un proyecto muy grande donde la ruta para crear usuarios es users/create. Pero de un momento a otro, nuestro jefe nos dice que no le gusta y decide que debe ser en español. Por el tamaño del proyecto tenemos botones y enlaces en múltiples lugares que apuntan a la dirección antes mencionada. Este cambio sin duda alguna es un problema demasiado frecuente y lo podemos solventar definiendo nombres a nuestras rutas.

La ventaja que nos ofrece estos nombres de ruta es que cuando queremos hacer referencia a una dirección las llamamos por sus nombres utilizando el helper route() . Para definir nombres de ruta tenemos 2 opciones que vamos a ver a continuación:

<?php

// Definición de rutas
Route::get('usuarios/crear', 'UserController@create')
    ->name('users.create');

Utilizando el método name podemos definir un nombre para nuestra ruta, mi recomendación es que siempre concuerde con lo que hace, en el ejemplo anterior es fácil comprender que la ruta con el nombre users.create crea un nuevo usuario.

Existe otra opción para definir un nombre a nuestra ruta y es pasando un arreglo como segundo parámetro después de colocar la dirección, de esta forma:

<?php

Route::get('usuarios', [
  'uses' => 'UserController@index',
  'as' => 'users.index'
]);

Mi recomendación es utilizar la primera opción ya que es una forma más legible.

Para llamar a un ruta debemos utilizar el helper route(), mencionado anteriormente. Vamos a colocar un par de ejemplos comenzando con un método de un controlador:

<?php
//...

public function store(Request $request)
{
  User::create($request->all());

  return redirect()->route('users.index');
}

Para referirnos a una ruta en una vista de nuestra aplicación lo hacemos de la siguiente forma:

<!-- Uso de rutas -->
<a href="{{ route('users.create') }}">Crear nuevo usuario</a>

Grupos de Rutas

Los grupos de rutas nos permiten compartir atributos de ruta, como Middlewares o Namespaces en una gran cantidad de rutas sin necesidad de definir esos atributos en cada ruta individual. Para definir un grupo de rutas debemos hacerlo indicando el método group que recibe como primer parámetro un arreglo donde especificamos los atributos y como segundo parámetro una función anónima donde indicamos todas las rutas pertenecientes al grupo:

<?php

Route::group(['middleware' => 'auth'], function() {
  Route::get('users', 'UserController@index');
  Route::get('users/create', 'UserController@create');
});

Otra forma con la cual podemos especificar Middlewares o Namespaces es invocando sus métodos y concatenando el método group, recibiendo únicamente la función anónima con el grupo de rutas. Podemos observar un ejemplo más claro a continuación:

<?php

Route::middleware(['auth', 'admin'])->group(function () {
  Route::get('services', 'ServiceController@index');
});

Route::namespace('Admin')->group(function () {
  Route::get('users', 'UserController@index');
});

Prefijos de Rutas

El método prefix se puede usar para prefijar cada ruta en el grupo con una URL dada. Por ejemplo, podemos prefijar todas las URL de las rutas dentro del grupo con admin:

<?php

Route::prefix('admin')->group(function () {
  Route::get('services', 'ServiceController@index')->name('services.index'));
});

La URL generada con el ejemplo anterior sería /admin/services, aunque el nombre permanece como services.index. En caso de querer agregar un prefijo al nombre de las rutas es posible hacerlo con el método name como se muestra a continuación:

<?php

Route::name('admin.')->prefix('admin')->group(function () {
  Route::get('services', 'ServiceController@index')->name('services.index'));
});

Ahora el nombre de la ruta dentro del grupo ya no es services.index sino admin.services.index.

Retornar vistas

En ocasiones podemos encontrarnos con secciones de una pagina web que no necesitan algún tipo de lógica y simplemente queremos colocar una pequeña reseña estática, una imagen, etc. Para este tipo de casos es frecuente ver métodos de un controlador donde solo retorna una vista sin aplicar otra lógica adicional.

Si este es tu caso, puedes definir una ruta que retorne directamente una vista, para hacerlo aplicamos el siguiente código:

<?php

Route::view('/contacto', 'contact');

Route::view('/contacto', 'contact', ['website' => 'Styde.net']);

El método view recibe 2 parámetros obligatorios que son la dirección de la URL y el nombre de la vista, además tenemos otro opcional que recibe un arreglo con todos los datos que deseamos pasar a la vista.

Expresiones Regulares Globales

Existe una forma de definir que un parámetro de ruta siempre esté restringido por una expresión regular dada, sin importar cual es la ruta ya que sería global. Para hacerlo debemos usar el método pattern dentro del método boot de nuestro app/Providers/RouteServiceProvider:

<?php
//...
public function boot()
{
  parent::boot();

  Route::pattern('id', '[0-9]+'); 
}

Con esto estamos definiendo que todas las rutas que reciban un parámetro llamado id lo reciban sólo si este es un número entero.

Dividir rutas en archivos

Si estamos trabajando en un proyecto web muy grande el archivo de rutas routes/web.php se puede convertir en un archivo con muchas rutas y sería algo engorroso poder modificarlo.

Si nuestro proyecto, por ejemplo, maneja un panel administrativo no estaría mal tener un archivo routes/admin.php y colocar todas las rutas del panel de administración, para hacerlo podemos comenzar creando el archivo, seguidamente editamos el método map de app/Providers/RouteServiceProvider.php:

<?php
//...
public function map()
{
  $this->mapApiRoutes();
  $this->mapWebRoutes();
  $this->mapAdminRoutes(); // Agregamos el llamado a este método
}

Ahora debemos crear el método mapAdminRoutes más abajo y colocar lo siguiente:

<?php
//...
protected function mapAdminRoutes()
{
  Route::middleware(['web', 'admin'])
    ->namespace($this->namespace)
    ->group(base_path('routes/admin.php'));
}

En este método estamos definiendo que todas las rutas en el archivo pasen por el middleware web y admin. Se supone que admin es un middleware que solo permite el acceso a los usuarios con el rol de administrador.

Límite de Accesos

Laravel incluye un middleware para limitar el acceso a las rutas dentro de nuestra aplicación. Para comenzar, debemos asignar el middleware throttle a una ruta o un grupo de rutas. El middleware throttle acepta dos parámetros que determinan la cantidad máxima de solicitudes que se pueden realizar en un número determinado de minutos:

<?php

// Uso de límites
Route::get('/users', 'UserController@index')->middleware(['auth', 'throttle:20,1']);

En este ejemplo, especificamos que un usuario autenticado puede acceder a la siguiente ruta 20 veces por minuto.

Información de la ruta actual

Quizás en algún momento pueda ser necesario saber cuál es la ruta que estamos usando durante la petición, su nombre o la acción que ejecutará del controlador. Para obtener esta información es necesario utilizar el Facade Route que nos ofrece 3 métodos que nos devolverán la información que hemos mencionado anteriormente.

<?php
//...
use Illuminate\Support\Facades\Route;

Route::current(); // Ruta Actual

Route::currentRouteName(); // Nombre de la ruta

Route::currentRouteAction(); // Acción de la ruta

¡Terminamos! Quiero resaltar que existen más características sobre las rutas en Laravel pero en este artículo resaltamos algunas muy importantes, además, también puedes comentar las dudas que tengas o cuál ha sido tu experiencia utilizando las rutas en Laravel.

Material Relacionado

Espero que te haya gustado este material. No olvides seguirnos en Twitter y suscribirte a nuestro boletín:

Suscríbete a nuestro boletín

Te enviaremos publicaciones con consejos útiles y múltiples recursos para que sigas aprendiendo.

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.