Laravel no para de sacar nuevas funcionalidades y Taylor Otwell ya ha anunciado la primera característica que se agregará a Laravel 7 y son los binding de modelos implícitos en las rutas.
¿Qué son los Binding de Modelos?
Los binding de modelos en las rutas es una característica muy poderosa que tiene Laravel. Cuando indicamos que una ruta va a recibir un ID, por ejemplo Route::get('post/{id}', 'PostController@show');
podemos cambiar el parámetro {id}
por el nombre del modelo que queremos obtener, {post}
e igualmente enviamos el valor del ID.
De esta manera, Laravel buscara automática el post con dicho ID y tendremos disponible el modelo encontrado, en nuestro controlador. En caso que no encuentre el registro, arrojara un error 404.
Hasta acá esto esta barbaro, pero el tema es ¿que paso si no quiero enviar el id y quiero enviar otro valor, como el slug por ejemplo? ¿Hay una forma de que Laravel se siga comportando de la misma forma?
Pues si, si la hay. Pero debemos meter mano en el código. Lo que deberíamos hacer es sobrescribir el método getRouteKeyName()
en el modelo Post
y establecer por que columna queremos que se haga el binding.
Y a partir de aquí ya podríamos enviar el titulo del post formateado en slug, en vez del ID del producto.
Lo nuevo de Laravel 7: Binding de Modelos Implícitos en las Rutas
A partir de Laravel 7 podremos especificar directamente en la ruta el campo por el que queremos que se haga el binding. Por ejemplo, el caso anterior se reemplazaría con el siguiente código:
Route::get('/posts/{post:slug}', 'PostController@show');
Ayudándonos con los dos puntos, establecemos el campo de post por el cual queremos que se haga el binding. Y ya no es necesario sobrescribir el método getRouteKeyName()
.
Cabe aclarar, que el método getRouteKeyName()
no quedara en desuso, por lo tanto, tus proyectos actuales que lo estén utilizando, no tendrán problemas.
Lo mejor de todo, es que vamos a poder definir rutas para la misma entidad pero que se vinculen por distintos campos. Cosa que, con la forma de sobrescribir el método, no podíamos.
Por ejemplo, podríamos tener:
Route::get('/posts/{post:slug}', 'PostController@show');
Y también podríamos tener:
Route::get('/posts/{post:id}/edit', 'PostController@edit');
Conclusión
Me parece una gran característica que permite una mejor organización y flexibilidad. Hoy por hoy, es un poco raro tener un método en el modelo encargado de un proceso que tiene que ver con las rutas, no? Y encima establecer un único campo como binding del modelo. Pero creo que esta característica nos ayudara mucho a nuestros sistemas.
Laravel 7 verá la luz en Febrero del 2020 y espero que vengan muchas nuevas cosas tan interesantes como esta. Sígueme en mis redes sociales para enterarte todas las noticias de Laravel. Nos vemos en la próxima 😉🤙.