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 cualnotas/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 denotas/crear
veremos el siguiente resultado en el navegador al acceder anotas/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(); }
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