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