es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Enlace personalizado para el modelo de usuario en Laravel: “/usuarios/yo/xxx”

Tengo rutas con enlaces de usuario como:

Route::get('users/{user}/posts', [PostController::class, 'index']);
Route::get('users/{user}/comments', [CommentController::class, 'index']);

Así que puedo usar /users/1/posts, /users/5/posts, etc., y en el controlador está automáticamente disponible gracias a la enlace de modelos.

public function index(User $user)
{
    dd($user);
}

Pero para el usuario actualmente iniciado de sesión, también quiero permitirle usar /me/ en lugar del ID, como /users/me/posts.

¿Existe alguna forma de hacerlo sin definir métodos separados en el controlador donde tendría que encontrar al usuario manualmente, y sin duplicar todas las rutas? ¿Es posible “extender” el enlace de modelos predeterminado de Laravel globalmente?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible ampliar la vinculación de modelos predeterminada de Laravel de forma global. Puedes lograr esto creando un enlazador de modelos personalizado en Laravel que verifique si el valor pasado en la URL es ‘me’ y lo reemplace por el ID del usuario actualmente conectado.

    Aquí tienes un ejemplo de cómo puedes crear un enlazador de modelos personalizado en Laravel:

    use Illuminate\Routing\RouteBinding;
    
    class MeBinding implements RouteBinding
    {
        /**
         * Recupera una instancia de modelo por clave de ruta.
         *
         * @param  string  $value
         * @return \Illuminate\Database\Eloquent\Model|null
         */
        public function bind($value)
        {
            if ($value === 'me') {
                return auth()->user();
            }
    
            return (new \App\Models\User())->resolveRouteBinding($value);
        }
    }
    

    En el código anterior, hemos creado un enlazador de modelos personalizado llamado MeBinding. En el método bind, primero verificamos si el valor pasado en la URL es ‘me’. Si es ‘me’, devolvemos el usuario actualmente conectado utilizando la función auxiliar auth(). Si no es ‘me’, devolvemos la instancia del modelo utilizando el método de vinculación de modelos predeterminado de Laravel.

    A continuación, debes registrar este enlazador de modelos personalizado en Laravel. Puedes hacer esto en el método boot del RouteServiceProvider.

    use Illuminate\Support\Facades\Route;
    
    public function boot()
    {
        Route::bind('user', MeBinding::class);
    }
    

    Ahora, cada vez que se coincida con una ruta con el parámetro {user}, Laravel utilizará el enlazador de modelos MeBinding para resolver el valor pasado en la URL y reemplazará automáticamente ‘me’ por el usuario actualmente conectado, gracias a nuestra lógica de enlace personalizado.

    Así que ahora puedes usar /users/me/posts o /users/1/posts y ambos funcionarán sin problemas con el mismo método del controlador, sin necesidad de duplicar rutas o controladores.

Comments are closed.