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
.Comparte este post si te fue de ayuda 馃檪.
Cualquier duda y/o sugerencia es bienvenida.
Reg铆strate
Inicia sesi贸n para acceder a nuestros cursos y llevar un control de tu progreso.
Cursos recomendados
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