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
idpuede contener letras y otros valores, por lo cualnotas/cincoes 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/crearveremos 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
