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
- Cómo organizar las rutas de tus proyectos en Laravel
- Grupos de Rutas en Laravel 5.*
- Rutas con Laravel
Espero que te haya gustado este material. No olvides seguirnos en Twitter y suscribirte a nuestro boletín:
Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.