Laravel 6

En esta lección te explicaré cómo definir rutas con parámetros dinámicos usando el framework Laravel a partir de su versión 6.

Esta lección incluye un video premium

Regístrate para ver este video y cientos de lecciones exclusivas.

Mira el código en GitHub: actual, resultado, comparación.

Vamos a definir una URL para editar las notas; lamentablemente: notas/editar no nos va a servir porque no nos permitiría saber qué nota hay que editar. Por supuesto una opción sería pasar el parámetro a través de la URL  notas/editar?id=5 y obtenerlo así:

<?php
//...
Route::get('notas/editar', function () {
    return 'Aquí podremos editar la nota: '.$_GET['id'];
});

Pero afortunadamente Laravel nos provee una manera más limpia de lograr lo anterior:

<?php
//...
Route::get('notas/{id}/editar', function ($id) {
    return 'Aquí podremos editar la nota: '.$id;
});

Las llaves nos permiten definir uno o más parámetros dinámicos para nuestras rutas y luego estos valores serán pasados como argumentos a la función anónima donde podremos utilizarlos.

Vamos a crear una última ruta para mostrar los detalles de una nota:

<?php
//...
Route::get('notas/{id}', function ($id) {
    return 'Aquí veremos los detalles de la nota: '.$id;
});

Ahora quiero que notes lo siguiente:

  • Primero: actualmente id puede contener letras y otros valores, por lo cual notas/cinco es una URL válida en nuestra APP
  • Segundo: el orden de las rutas importa bastante, la primera ruta que coincida será utilizada. Por lo que si colocamos notas/{id} ANTES de notas/crear veremos el siguiente resultado en el navegador al acceder a notas/crear: «Aquí veremos los detalles de la nota:» crear lo cual es inesperado.

Es posible restringir los valores aceptados para un parámetro de forma local usando el método where el cual acepta el nombre del parámetro y luego una expresión regular:

<?php
Route::get('notas/{id}/editar', function ($id) {
    return 'Aquí podremos editar la nota: '.$id;
})->where('id', '[0-9]+');   // o ->where('id', '\d+')

También es posible hacerlo de forma global (para todas las rutas) agregando lo siguiente al método boot dentro de app/Providers/RouteServiceProvider.php:

<?php
//...
    public function boot()
    {
        Route::pattern('id', '\d+');

        parent::boot();
    }
Únete a nuestra comunidad en Discord y comparte con los usuarios y autores de Styde, 100% gratis.

Únete hoy

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

Lección anterior Rutas básicas en Laravel 6 Lección siguiente Copiar plantillas de HTML y CSS estáticas a Laravel 6