Controladores Laravel más limpios con enlace de modelo de ruta

Introducción
Laravel, ya sea como marco para crear sitios web o como contenedor para crear API (lumen), ha evolucionado hasta convertirse en el marco de elección de los desarrolladores. Laravel incluye muchas características en constante crecimiento; por ejemplo, los eventos de Laravel. Los eventos en Laravel solían ser una biblioteca de publicación y suscripción simple, pero ahora los eventos de Laravel pueden transmitirse hasta el cliente y nos permiten crear aplicaciones en tiempo real.
Pero eso no viene al caso, la celebridad de hoy es el enlace del modelo de ruta de Laravel.
¿Qué es la vinculación del modelo de ruta?
La vinculación de modelos de ruta en Laravel proporciona un mecanismo para inyectar una instancia de modelo en sus rutas. Si bien no está claro el significado, aquí hay un ejemplo. Digamos que queremos obtener una publicación de la base de datos, podríamos hacer algo como esto:
...// the route parameter is the id of the post// for example http://example.com/posts/53Route::get('posts/{id}', function ($id) { // we have to find the post using the $id $post = Post::find($id); // if there is no post, 404 if (!$post) return abort(404); // return the view and the post return view('post.show', compact('post'));});...
Podríamos continuar simplificando este método en
...// the route parameter is the id of the post// for example http://awesome.dev/posts/53Route::get('posts/{id}', function ($id) { // find the post or 404 if not found $post = Post::findOrFail($id); // return the view and the post return view('post.show', compact('post'));});...
Pero la vinculación del modelo de ruta nos ayuda a deshacernos de pulsaciones de teclas adicionales al simplificar ambas instancias anteriores en
...// by using $post, we can inject the Post objectRoute::get('posts/{post}', function ($post) { // we now have access to the $post object! no code necessary // return the view and the post return view('post.show', compact('post'));});...
Esto es posible al indicarle a Laravel que inyecte un Postmodelo en cualquier controlador de ruta que tenga un {post}parámetro adjunto.
Actualmente, Laravel admite dos tipos de enlaces de modelos de ruta:
- Vinculación implícita del modelo
- vinculación explícita del modelo
Nota: El ejemplo de vinculación del modelo de ruta mencionado anteriormente es explícito.
Vinculación implícita de modelos
Si bien hemos visto la vinculación de modelos explícita, aquí hay un ejemplo de vinculación de modelos implícita ahora:
Route::get('posts/{post}', function (AppPost $post) { // be awesome. enjoy having the $post object});
Laravel es lo suficientemente inteligente como para saber que, dado que Postse está inyectando un modelo en el cierre del controlador, debe obtener el idparámetro de la ruta y obtener los detalles para el usuario.
El acceso a una publicación se seguirá realizando mediante http://awesome.example.com/posts/24.
Cambiar la clave de ruta del modelo
Si desea que el enlace de modelo implícito utilice una columna de base de datos en un momento distinto al idde recuperar modelos, puede anular el getRouteKeyNamemétodo en su modelo Eloquent.
Por ejemplo, si quisiéramos utilizar el slugen lugar del id, podríamos hacer lo siguiente:
class Post extends Model { public function getRouteKeyName() { return 'slug'; }}
Luego podríamos acceder a nuestra ruta usando http://awesome.example.com/posts/my-post-slugen lugar de http://awesome.example.com/posts/24.
Vinculación explícita de modelos
Tal como lo indica el nombre, debes indicarle explícitamente a Laravel que deseas que vincule un urlparámetro a un modelo en particular. Hay dos formas de hacerlo: podemos vincular un parámetro a un modelo utilizando la Routefachada provista o realizar esta vinculación en app/Providers/RouteServiceProvider.php(yo prefiero este método).
Usando la Routefachada
Usando la Routefachada para vincular un parámetro a un modelo, podemos hacer algo como esto:
Route::bind('post', 'AppPost');
También podríamos darle más significado a nuestro binding, por ejemplo, ¿qué pasa si queremos una publicación solo si es un borrador? Para eso, podríamos cambiar el segundo parámetro de la Route::binda un cierre que tome el parámetro de ruta como su valor.
Route::bind('post', function ($value) { return AppPost::find($value)-where('status', '=', 'published')-first();});
Usando elRouteServiceProvider
La única diferencia entre usar la Routefachada y RouteServiceProviderla clase es que el registro de los enlaces se realiza en el bootmétodo de la RouteServiceProviderclase (la ubicación es app/Providersel directorio) y el bindmétodo se llama en el $routerobjeto inyectado en el método. Ejemplo rápido
public function boot(Router $router){ parent::boot($router); $router-bind('post', function ($value) { return AppPost::find($value)-where('status', '=', 'published')-first(); });}
Excepciones personalizadas para la vinculación del modelo de ruta
Creo muchas API, por lo que las excepciones personalizadas para los enlaces de modelos de ruta son en realidad más útiles para personas como yo. Laravel nos proporciona una forma sencilla de hacer esto. Aún en el bootmétodo de la RouteServiceProviderclase, llama al modelmétodo en el $routerobjeto.
El modelmétodo toma tres argumentos, los argumentos son similares a los del bindmétodo, con una nueva adición, el tercer argumento, que es un cierre que lanza la nueva excepción.
$router-model($routeParameter, $modelToBind, function () { throw new NotFoundHTTPException;});
Conclusión
Puede leer más sobre la vinculación del modelo de ruta en la documentación.
Con suerte, esta pequeña pero útil característica podrá ahorrarle algunas líneas de código en sus proyectos y hacer que sus controladores sean mucho más limpios.

Deja una respuesta