Claves Personalizadas y Alcance
Cuando se vinculan implícitamente múltiples modelos Eloquent en una sola definición de ruta, puede que desees limitar el segundo modelo Eloquent para que sea un hijo del modelo anterior. Esto es útil en situaciones donde deseas asegurarte de que un recurso está relacionado con otro, como un post de blog que pertenece a un usuario específico.
Donde escribir el código
El código debe ser escrito en el archivo routes/web.php
de tu aplicación Laravel.
Ejemplo de Ruta
A continuación, se muestra un ejemplo de cómo recuperar un post de blog por su slug para un usuario específico:
php
use App\Models\Post;
use App\Models\User;
Route::get('/users/{user}/posts/{post:slug}', function (User $user, Post $post) {
return $post;
});
Explicación del código
En este ejemplo, estamos definiendo una ruta que permite acceder a un post de blog específico de un usuario. Aquí hay un desglose de cómo funciona:
- Definición de la Ruta: La ruta
/users/{user}/posts/{post:slug}
está configurada para buscar un modelo de usuario basado en el parámetro{user}
y un modelo de post basado en elslug
proporcionado en la URL. Esto significa que la URL debe seguir el formatowww.conozcalaravel.test/users/1/posts/mi-post
, donde1
es el ID del usuario ymi-post
es el slug del post. - Vinculación Implícita: Cuando Laravel procesa esta ruta, buscará automáticamente el modelo
User
correspondiente al ID o slug proporcionado. Luego, buscará el modeloPost
utilizando el slug, pero solo entre los posts que pertenecen a ese usuario. Esto asegura que el post que se está intentando acceder realmente pertenezca al usuario especificado. - Convenciones de Relación: Laravel asume que el modelo
User
tiene una relación llamadaposts
(la forma plural del nombre del parámetro de la ruta). Esto significa que Laravel utilizará esta relación para buscar el post correspondiente. Si el modeloUser
tiene una relación definida comopublic function posts()
, Laravel utilizará esta función para obtener los posts asociados al usuario. - Comportamiento por Defecto: Si el post no se encuentra entre los posts del usuario, Laravel generará automáticamente un error 404. Esto es útil para evitar que los usuarios accedan a posts que no les pertenecen, mejorando así la seguridad de la aplicación.
Uso de Claves Personalizadas y Alcance
Si deseas que Laravel limite las vinculaciones «hijas» incluso cuando no se proporciona una clave personalizada, puedes invocar el método scopeBindings
al definir tu ruta:
php
use App\Models\Post;
use App\Models\User;
Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) {
return $post;
})->scopeBindings();
Esto le indica a Laravel que debe aplicar el alcance a la búsqueda del modelo Post
, asegurando que solo se busque entre los posts que pertenecen al usuario especificado. Esto es especialmente útil si el slug no se utiliza como clave, pero aún deseas mantener la relación entre el usuario y sus posts.
Grupo de Rutas con Alcance
También puedes instruir a un grupo completo de definiciones de rutas para que utilicen vinculaciones con alcance:
php
Route::scopeBindings()->group(function () {
Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) {
return $post;
});
});
Esto es útil si tienes múltiples rutas que requieren el mismo comportamiento de alcance, ya que puedes definirlo una sola vez para todas las rutas dentro del grupo.
Desactivar el Alcance
Si en algún momento deseas desactivar el alcance de las vinculaciones, puedes hacerlo invocando el método withoutScopedBindings
:
php
Route::get('/users/{user}/posts/{post:slug}', function (User $user, Post $post) {
return $post;
})->withoutScopedBindings();
Esto permitirá que Laravel busque el modelo Post
sin restringir la búsqueda al usuario especificado, lo que puede ser útil en ciertos casos donde deseas permitir el acceso a posts de otros usuarios.
Visualización Gráfica en Pantalla
Cuando un usuario intenta acceder a un post que no pertenece a él, como www.conozcalaravel.test/users/1/posts/slug-invalido
, Laravel generará un error 404 si el post no se encuentra entre los posts del usuario con ID 1.
En la pantalla de Chrome, el resultado podría mostrarse como:
Conclusión
El uso de claves personalizadas y el alcance en Laravel te permite gestionar de manera efectiva las relaciones entre modelos en tus rutas. Esto no solo mejora la seguridad al garantizar que los recursos estén relacionados correctamente, sino que también simplifica la lógica de tu aplicación al utilizar las convenciones de Laravel.
Enlaces de interés
Para más información, visita:
- Página oficial de Laravel – Aquí encontrarás la documentación completa y recursos sobre Laravel, incluyendo guías y tutoriales sobre cómo manejar rutas y modelos.
- Curso de enrutamiento de Conozca Laravel – Un curso que ofrece una explicación detallada sobre el enrutamiento en Laravel, ideal para aprender a manejar rutas y enlaces de manera efectiva.
Etiqueta:rutas