Antes que te vayas
Inscríbete en nuestro curso gratuito de Laravel
De pronto un usuario necesita iniciar sesión o registrarse en nuestra aplicación. ¡Nos interesa que no se pierda de lo que estaba haciendo!
Por defecto el middleware auth
que Laravel define se encarga de hacer una redirección, para que el usuario vuelva a la página a la que estaba tratando de acceder.
Aunque esto funciona correctamente con peticiones GET, no funciona adecuadamente con peticiones POST donde se envían ciertos datos.
Es por ello que, hay ocasiones en las que nos conviene anticipar estas situaciones, y sería ideal que Laravel nos entienda si le decimos lo siguiente:
Lleva al usuario al formulario de inicio de sesión. Dile que inicie sesión antes de continuar. Si aún no se ha registrado, ofrécele un enlace para que lo pueda hacer. Luego tráelo de vuelta a esta página.
Sería genial poder enviar al usuario a un enlace de login (como los 2 siguientes ejemplos) y que sea redirigido a la URL o ruta indicada, incluso si se acaba de registrar:
mi-aplicacion.com/login?redirect_to=/ruta/donde/estaba
mi-aplicacion.com/login?redirect_to=mi-aplicacion.com/ruta/distinta/segun/convenga
Pues eso es justamente lo que vamos a hacer ahora.
Debemos anticiparnos a la situación y generar el enlace correspondiente para usuarios que aún no han iniciado sesión en nuestra aplicación.
Por ejemplo, supongamos que estoy desarrollando una aplicación que permite buscar empleo. Esta aplicación permite a los interesados postular a las ofertas de trabajo.
Me interesa que:
Entonces en mi caso prepararía la vista de la siguiente forma:
@if (auth()->check())
<form action="{{ url('/job/'.$job->id.'/apply') }}" method="post">
<button type="submit" class="btn blue no-margin">
Postular al trabajo
</button>
</form>
@else
<a href="{{ url('/login?redirect_to='.url()->current()) }}" class="btn blue no-margin">
Postular al trabajo
</a>
@endif
Hasta aquí hay que tener en cuenta lo siguiente:
url()->current()
para obtener la URL actual, de tal forma que el usuario regrese a esta página luego de autenticarse.Si el usuario ya había iniciado sesión, entonces el formulario realiza una petición POST y no hay nada nuevo.
Pero si no hay ningún usuario autenticado, entonces el enlace enviará al usuario a una ruta como la siguiente:
http://tawa.dev.pe:8080/login?redirect_to=http://tawa.dev.pe:8080/empleo/fullstack-developer/2
De seguro ya notaste que:
tawa.dev.pe
http://tawa.dev.pe:8080/empleo/fullstack-developer/2
En fin. Continuemos.
En este segundo paso, debemos preparar a nuestra página de login para que entienda e interprete el parámetro redirect_to
.
¿Cómo hacemos eso? ¡Exacto! En LoginController
(se encuentra en app/Http/Controllers/Auth
).
Si no has hecho ningún cambio, el controlador tendrá este aspecto:
class LoginController extends Controller
{
use AuthenticatesUsers;
protected $redirectTo = '/home';
public function __construct()
{
$this->middleware('guest')->except('logout');
}
}
Respecto al controlador, debes tener en cuenta lo siguiente:
$redirectTo
permite definir una ruta, para que todo usuario sea redirigido allí luego de iniciar sesión.php artisan make:auth
para generar nuestro sistema de autenticación.AuthenticatesUsers
.Nosotros necesitamos que los usuarios sean redirigidos a una ruta dinámica, en caso que se haya solicitado una redirección. Y que se continúe usando la ruta constante definida por el atributo $redirectTo
de caso contrario.
Para lograr esto vamos a sobreescribir 2 métodos.
Por lo tanto añadimos los siguientes 2 métodos sobre nuestro LoginController
:
public function showLoginForm(IlluminateRequest $request)
{
if ($request->has('redirect_to')) {
session()->put('redirect_to', $request->input('redirect_to'));
}
return view('auth.login');
}
public function redirectTo()
{
if (session()->has('redirect_to'))
return session()->pull('redirect_to');
return $this->redirectTo;
}
Aquí:
redirect_to
en caso que exista un parámetro con el mismo nombre.redirectTo
. Pero nosotros estamos sobreescribiendo el método, para que, en caso de existir una variable de sesión, se use el valor de esta variable y de paso deje de existir (ya que eso hace pull
, devolver el valor y eliminar la variable de sesión).Lo que hicimos en el paso 2 sirve para que un usuario sea redirigido a la página indicada en el parámetro redirect_to
(que es enviado a la ruta /login
).
Si queremos que el usuario sea redirigido según el valor de dicho parámetro, incluso si se acaba de registrar, debemos también aplicar un cambio en RegisterController
(para que haga caso a nuestra variable de sesión, la que creamos en LoginController
).
Entonces en RegisterController
también sobreescribimos el método redirectTo:
public function redirectTo()
{
if (session()->has('redirect_to'))
return session()->pull('redirect_to');
return $this->redirectTo;
}
Finalmente, vamos a verificar que todo funcione correctamente.
http://tawa.dev.pe:8080/login?redirect_to=http://tawa.dev.pe:8080/empleo/fullstack-developer/2
.http://tawa.dev.pe:8080/register
. Pero, aunque se ha perdido el parámetro GET de la URL, la variable de sesión sigue existiendo. Así que no hay problema.http://tawa.dev.pe:8080/empleo/fullstack-developer/2
.Aprende Laravel desde cero y desarrolla aplicaciones web reales, en tiempo récord, de la mano de Laravel.
Ingresar al cursoActualiza tus proyectos desde cualquier versión hasta la última versión estable de Laravel.
Ingresar al cursoDesarrollemos un Messenger! Aprende sobre Channels, Queues, Vuex, JWT, Sesiones, BootstrapVue y mucho más.
Ingresar al cursoInscríbete en nuestro curso gratuito de Laravel
Cargando comentarios ...