Hoy vamos a hablar un poco sobre los parámetros que se pueden pasar en la URL cuando usamos el framework Laravel y sobre la importancia del nombre de la variable que los mismos deben tener.
Recuerda que cuando usas un resource de Laravel, el framework asigna un nombre dependiendo del modelo; y varias veces no es el que esperamos.
Por otro lado debemos cuidar el nombre de la variable cuando recibimos el parámetro en un controlador.
Veamos cómo funcionan los parámetros de ruta en Laravel al usar resources y controladores, además de un truco para saber el nombre de los parámetros de las rutas de Laravel.
Recibir parámetro: nombre de variable
Primero veamos qué nombre debe tener nuestro parámetro. Este nombre es muy importante y debe coincidir con el resource.. Por ejemplo yo tengo mi método destroy
:
<?php
public function destroy(User $user)
{
$user->deleteOrFail();
return redirect()->back()->with("mensaje", "Usuario eliminado");
}
Fíjate en que recibo el parámetro de tipo User
, pero la variable en este caso no tendrá al usuario que espero, ya que al definirlo en mi resource no le puse ese nombre, así que debo recibirlo como usuario
, literalmente así:
<?php
public function destroy(User $usuario)
{
$usuario->deleteOrFail();
return redirect()->back()->with("mensaje", "Usuario eliminado");
}
Ahora el parámetro se llama usuario, y esto es porque al definir mi resource lo hice con “usuarios”, y el parámetro es la versión singularizada de esa cadena.
<?php
Route::resource("usuarios", UserController::class)->except(["store"]);
Listar parámetros de URL en Laravel
En este caso para “usuarios
” es fácil saber el nombre del parámetro (y variable) en singular, pero para cuando son otras cosas como “publicaciones_foros
” o cosas complejas puede que no sepamos el nombre del parámetro ya que el algoritmo de Laravel lo puede entender de manera distinta.
Por ello es que un truco que podemos aplicar es listar las rutas con: php artisan route:list
Que nos dará una salida como la siguiente:
GET|HEAD / .........................................................................................................................................................
GET|HEAD foros/create ......................................................................................................... foros.create › ForoController@create
GET|HEAD notificaciones/{notificacione}/edit ..................................................................... notificaciones.edit › NotificacionController@edit
GET|HEAD productos ...................................................................................................... productos.index › ProductoController@index
DELETE publicaciones_foros/{publicaciones_foro} ................................................ publicaciones_foros.destroy › PublicacionDeForoController@destroy
GET|HEAD publicaciones_foros/{publicaciones_foro}/edit ................................................. publicaciones_foros.edit › PublicacionDeForoController@edit
Y aquí podemos ver que en el caso de publicaciones_foros
el parámetro se llama publicaciones_foro
(aunque un humano lo llamaría publicacion_foro, pero el algoritmo no).
Así es como podemos averiguar el nombre de los parámetros con Laravel.
Igualmente podemos indicar la versión singularizada de nuestro resource al momento de definirlo, pero en caso de que tengas prisa o quieras dejar todo como está puedes hacer lo de este post.