Laravel 5 - 登录后重定向回上一页

cs1*_*s1h 28 php laravel-5

我有一个页面上有一些内容和评论部分.注释只能由登录的用户保留,因此我已将登录表单添加到页面以供用户登录(仅在他们尚未登录时显示).

我遇到的问题是,当用户登录时,他们会被重定向回主页,而不是他们之前所在的页面.

我还没有从开箱即用的设置中更改登录方法.

任何人都可以建议一种简单的方法来设置重定向网址.我的想法是能够在表单中设置它会很好.

Dig*_*uin 43

laravel 5.3的解决方案:

在loginController中,将showLoginForm()函数覆盖为以下函数:

public function showLoginForm()
{
    if(!session()->has('url.intended'))
    {
        session(['url.intended' => url()->previous()]);
    }
    return view('auth.login');    
}
Run Code Online (Sandbox Code Playgroud)

它将设置"url.intended"会话变量,即laravel用于在登录后使用前一个URL查找要重定向的页面的变量.

它还检查是否已设置变量,以避免在用户提交带有错误的表单时使用登录URL设置变量.

  • 此解决方案在laravel 5.7中仍然有效! (4认同)

小智 22

对于Laravel 5.5,以下代码只是通过更新LoginController.php为我工作

public function showLoginForm()
{
    session(['link' => url()->previous()]);
    return view('auth.login');
}


protected function authenticated(Request $request, $user)
{
    return redirect(session('link'));
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢Hasan,这就像一个魅力. (2认同)

bnq*_*oan 14

redirect()->intended()在Laravel 5.1中使用

您还可以在此处查看更多相关信息:http://laravel.com/docs/5.1/authentication


Mah*_*mid 14

对于Laravel 5.3

App/Http/Controllers/Auth/LoginController 这个__construct()函数中添加这一行

$this->redirectTo = url()->previous();
Run Code Online (Sandbox Code Playgroud)

所以完整的代码将是

public function __construct()
{
    $this->redirectTo = url()->previous();
    $this->middleware('guest', ['except' => 'logout']);
}
Run Code Online (Sandbox Code Playgroud)

它对我来说就像一个魅力我正在使用laravel 5.3.30


Ada*_*dam 8

如果您想始终重定向到/home除带注释的页面之外的页面,那么您应该覆盖redirectToLoginController 中的方法:

public function redirectTo()
{
     return session('url.intended') ?? $this->redirectTo;
}
Run Code Online (Sandbox Code Playgroud)

在您想要保留在网站上的所有页面上,您应该在会话中存储一个请求的 url:

public function show(Category $category, Project $project){
   // ...

   session()->flash('url.intended' , '/' . request()->path());
}
Run Code Online (Sandbox Code Playgroud)


vip*_*pin 6

对于Laravel 5.4,以下代码只是通过更新LoginController.php为我工作

use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\URL;


public function __construct()
{
    $this->middleware('guest', ['except' => 'logout']);
    Session::put('backUrl', URL::previous());
}


public function redirectTo()
{
    return Session::get('backUrl') ? Session::get('backUrl') :   $this->redirectTo;
}
Run Code Online (Sandbox Code Playgroud)


小智 6

Laravel 5.6,当用户输入错误的凭据时,登录页面将重新加载并进行会话(['link'=> url()-> previous()]); 将在链接变量中使用登录URL。因此,如果登录成功,用户将再次重定向到登录页面,或者重定向到/ home。因此,请避免使用以下代码为我服务!之后,无论用户输入错误的凭据多少时间,他都会在登录后重定向到登录页面之前的确切位置。

在LoginController中更新或覆盖公共函数showLoginForm()。

public function showLoginForm()
{
    if (session('link')) {
        $myPath     = session('link');
        $loginPath  = url('/login');
        $previous   = url()->previous();

        if ($previous = $loginPath) {
            session(['link' => $myPath]);
        }
        else{
            session(['link' => $previous]);
        }
    }
    else{
         session(['link' => url()->previous()]);
    }

    return view('auth.login');
}
Run Code Online (Sandbox Code Playgroud)

另外,在LoginController中验证或更新受保护的功能(请求$ request,$ user)。

protected function authenticated(Request $request, $user)
{     
    return redirect(session('link'));      
}
Run Code Online (Sandbox Code Playgroud)


Lok*_*oko 5

看看laravel备忘单

并使用:

URL::previous();
Run Code Online (Sandbox Code Playgroud)

转到上一页.


小智 5

使用当前页面 url 作为查询字符串重定向到登录:

<a href="{{ url('login?redirect_to=' . urlencode(request()->url())) }}">login</a>
Run Code Online (Sandbox Code Playgroud)

在您的 LoginController 检查是否存在并将查询字符串保存在会话中,然后在登录后重定向到 url

public function __construct() {
        parent::__construct();
        if ( \request()->get( 'redirect_to' ) ) {
            session()->put( 'redirect.url', \request()->get( 'redirect_to' ) );
        }
        $this->middleware( 'guest' )->except( 'logout' );
}

protected function authenticated(Request $request, $user) {
        if(session()->has('redirect.url') {
             return redirect( session()->get( 'redirect.url' ) );
        }
}
Run Code Online (Sandbox Code Playgroud)