login后,Laravelredirect回原始目的地

这似乎是一个非常基本的stream程, Laravel对于基本的东西有很多很好的解决scheme,我觉得我错过了一些东西。

用户点击需要validation的链接。 Laravel的身份validationfilter启动并将其路由到login页面。 用户login后,在“auth”filter启动之前,转到他们尝试访问的原始页面。

有没有一种很好的方法可以知道他们原来想要访问的页面? 由于Laravel是拦截请求的人,我不知道它是否跟踪用户login后容易路由的地方。

如果没有,我会好奇听到你们是如何手动实现这一点的。

对于Laravel 5.3及以上版本

检查斯科特的答案如下。

对于Laravel 5高达5.2

简单的说,

在身份validation中间件上:

 // redirect the user to "/login" // and stores the url being accessed on session if (Auth::guest()) { return redirect()->guest('login'); } return $next($request); 

在login操作:

 // redirect the user back to the intended page // or defaultpage if there isn't one if (Auth::attempt(['email' => $email, 'password' => $password])) { return redirect()->intended('defaultpage'); } 

对于Laravel 4(老答案)

在这个答案的时候,框架本身没有官方的支持。 现在你可以使用 下面bgdrl指出的方法 这个方法:( 我试过更新他的答案,但似乎他不会接受)

在validationfilter上:

 // redirect the user to "/login" // and stores the url being accessed on session Route::filter('auth', function() { if (Auth::guest()) { return Redirect::guest('login'); } }); 

在login操作:

 // redirect the user back to the intended page // or defaultpage if there isn't one if (Auth::attempt(['email' => $email, 'password' => $password])) { return Redirect::intended('defaultpage'); } 

对于Laravel 3(甚至更老的答案)

你可以像这样实现它:

 Route::filter('auth', function() { // If there's no user authenticated session if (Auth::guest()) { // Stores current url on session and redirect to login page Session::put('redirect', URL::full()); return Redirect::to('/login'); } if ($redirect = Session::get('redirect')) { Session::forget('redirect'); return Redirect::to($redirect); } }); 
 // on controller public function get_login() { $this->layout->nest('content', 'auth.login'); } public function post_login() { $credentials = [ 'username' => Input::get('email'), 'password' => Input::get('password') ]; if (Auth::attempt($credentials)) { return Redirect::to('logged_in_homepage_here'); } return Redirect::to('login')->with_input(); } 

即使用户错过input他的凭证,或者他没有帐户并需要注册,在Session上存储redirect也有持续的好处。

这也允许除了身份validation以外的任何其他设置会话的redirect,它会奇迹般的工作。

我发现这两个很棒的方法可能对你非常有帮助。

 Redirect::guest(); Redirect::intended(); 

您可以将此filter应用于需要validation的路由。

 Route::filter('auth', function() { if (Auth::guest()) { return Redirect::guest('login'); } }); 

这种方法基本上是存储您正在访问的页面,并将其redirect到login页面。

当用户被authentication时,你可以打电话

 return Redirect::intended(); 

它会将您redirect到首先尝试访问的页面。

尽pipe我通常使用下面的方法,但这是一个很好的方法。

 Redirect::back() 

你可以检查这个真棒博客。

你可以使用redirect::打算的function。 它会将用户redirect到它们在被authenticatonfilter捕获之前尝试访问的URL。 如果预期目标不可用,则可以给此方法提供回退URI。

在postlogin/注册:

 return Redirect::intended('defaultpageafterlogin'); 

Laravel> = 5.3

5.3中的Auth变更使得这个实现变得简单一些,并且由于Auth中间件已经被移动到服务容器,所以略微不同于5.2。

修改新的中间件身份validationredirect器

 /app/Http/Middleware/RedirectIfAuthenticated.php 

稍微改变句柄function,看起来像这样:

 public function handle($request, Closure $next, $guard = null) { if (Auth::guard($guard)->check()) { return redirect()->intended('/home'); } return $next($request); } 

TL; DR解释

唯一的区别是在第四行; 默认情况下它看起来像这样:

 return redirect("/home"); 

由于Laravel> = 5.3在检查Auth Guard时会自动保存最后一个“预期”路由,因此它将更改为:

 return redirect()->intended('/home'); 

这会告诉Laravel在login之前将其redirect到最后一个预定页面,否则默认情况下会转到“/ home”或您希望发送到的位置。

希望这可以帮助别人 – 5.2和5.3之间的差异并不多,特别是在这个领域有不less。

我一直在使用我的语言select器代码一段时间。 只要你只需要返回1页就可以正常工作:

 return Redirect::to(URL::previous()); 

这不是那里最强大的解决scheme,但它是超级简单的,可以帮助解决一些难题。 🙂

 return Redirect::intended('/'); 

这会将您redirect到您的项目的默认页面,即起始页面。

对于laravel 5. *尝试这些。

 return redirect()->intended('/'); 

要么

 return Redirect::intended('/'); 

Laravel 3

我稍微调整了你的(ViníciusFragoso Pinheiro)代码,并将其放在filters.php中

 Route::filter('auth', function() { // If there's no user authenticated session if (Auth::guest()) { // Flash current url to session and redirect to login page Session::flash('redirect', URL::full()); return Redirect::guest('login'); } }); 

然后在我的AuthController.php中:

 // Try to log the user in. if (Auth::attempt($userdata)) { if ($redirect = Session::get('redirect')) { return Redirect::to($redirect); } else { // Redirect to homepage return Redirect::to('your_default_logged_in_page')->with('success', 'You have logged in successfully'); } } else { // Reflash the session data in case we are in the middle of a redirect Session::reflash('redirect'); // Redirect to the login page. return Redirect::to('login')->withErrors(['password' => 'Password invalid'])->withInput(Input::except('password')); } 

请注意,如果存在身份validation问题, 'redirect'会话数据将被刷新。 这会在任何login失败期间保持redirect不变,但是如果用户在任何时候点击,则下一个login过程不会被会话数据中断。

您还需要在AuthController中显示login表单时重新刷新数据,否则链会中断:

 public function showLogin() { // Reflash the session data in case we are in the middle of a redirect Session::reflash('redirect'); // Show the login page return View::make('auth/login'); } 

使用Redirect;

然后使用这个:

 return Redirect::back(); 

将您的LoginControllers构造函数更改为:

 public function __construct() { session(['url.intended' => url()->previous()]); $this->redirectTo = session()->get('url.intended'); $this->middleware('guest')->except('logout'); } 

它会将您redirect到login页面之前的页面(返回2页)。

你在route.php中试过了吗?

 Route::group(['middleware' => ['web']], function () { // Route::get('/','HomeController@index'); }); 
  // Also place this code into base controller in contract function, because ever controller extends base controller if(Auth::id) { //here redirect your code or function } if (Auth::guest()) { return Redirect::guest('login'); } 

这是我的5.1解决scheme。 我需要有人点击post上的“赞”button,redirectlogin,然后返回到原始页面。 如果他们已经login,那么“Like”button的href被JavaScript拦截,并变成一个AJAX请求。

button是像<a href="/like/931">Like This Post!</a>/like/931由LikeController处理,需要auth中间件。

在Authenticate中间件( handle()函数)中,在开始时添加如下内容:

  if(!str_contains($request->session()->previousUrl(), "/auth/login")) { $request->session()->put('redirectURL', $request->session()->previousUrl()); $request->session()->save(); } 

/auth/login更改为无论您的URL用于login。此代码将原始页面的URL保存在会话中,除非该URL是loginURL。 这是必需的,因为看起来好像这个中间件被调用了两次。 我不知道为什么或者如果那是真的。 但是如果你不检查这个条件,它将等于正确的原始页面,然后以某种方式偶然/auth/login 。 有可能是一个更优雅的方式来做到这一点。

然后,在LikeController或任何控制器,你可以处理原始页面上button的URL:

 //some code here that adds a like to the database //... return redirect($request->session()->get('redirectURL')); 

这种方法非常简单,不需要重写任何现有的function,而且工作效率很高。 Laravel可能有一些简单的方法来做到这一点,但我不确定它是什么。 使用desired intended()函数在我的情况下不起作用,因为LikeController也需要知道以前的URLredirect到它。 基本上两个级别的redirect向后。

对于Laravel 5.2 (以前的版本,我没有使用)

将代码粘贴到文件app \ Http \ Controllers \ Auth \ AurhController.php中

  /** * Overrides method in class 'AuthenticatesUsers' * * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ public function showLoginForm() { $view = property_exists($this, 'loginView') ? $this->loginView : 'auth.authenticate'; if (view()->exists($view)) { return view($view); } /** * seve the previous page in the session */ $previous_url = Session::get('_previous.url'); $ref = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''; $ref = rtrim($ref, '/'); if ($previous_url != url('login')) { Session::put('referrer', $ref); if ($previous_url == $ref) { Session::put('url.intended', $ref); } } /** * seve the previous page in the session * end */ return view('auth.login'); } /** * Overrides method in class 'AuthenticatesUsers' * * @param Request $request * @param $throttles * * @return \Illuminate\Http\RedirectResponse */ protected function handleUserWasAuthenticated(Request $request, $throttles) { if ($throttles) { $this->clearLoginAttempts($request); } if (method_exists($this, 'authenticated')) { return $this->authenticated($request, Auth::guard($this->getGuard())->user()); } /*return to the previous page*/ return redirect()->intended(Session::pull('referrer')); /*return redirect()->intended($this->redirectPath()); /*Larevel default*/ } 

并导入命名空间: use Session;

如果你还没有对文件app \ Http \ Controllers \ Auth \ AurhController.php做任何修改,你可以用GitHub中的文件replace它

Laravel 5.2

如果您正在使用其他中间件(如Admin中间件),则可以使用以下方法为url.intended设置会话:

基本上我们需要手动设置\Session::put('url.intended', \URL::full()); redirect。

  if (\Auth::guard($guard)->guest()) { if ($request->ajax() || $request->wantsJson()) { return response('Unauthorized.', 401); } else { \Session::put('url.intended', \URL::full()); return redirect('login'); } } 

在login尝试

确保在login尝试使用return \Redirect::intended('default_path');

Larvel 5.3实际上只是更新了LoginController.php

  use Illuminate\Support\Facades\Session; use Illuminate\Support\Facades\URL; public function __construct() { $this->middleware('guest', ['except' => 'logout']); Session::set('backUrl', URL::previous()); } public function redirectTo() { return Session::get('backUrl') ? Session::get('backUrl') : $this->redirectTo; } 

ref: https : //laracasts.com/discuss/channels/laravel/redirect-to-previous-page-after-login