在開發 web 應用程序時,用戶登錄認證是一個必不可少的功能。laravel 框架提供了多種方式實現用戶認證,而且還提供了一套默認的身份認證系統(即 laravelilluminateauth),方便開發者在應用程序中實現用戶注冊、登錄、退出等功能。
對于登錄認證成功后,我們常常希望跳轉到特定頁面,比如用戶的個人資料頁,或者某個特定功能頁。在 Laravel 框架中,實現登錄后跳轉非常簡單。
本文將介紹 Laravel 框架中用戶登錄后跳轉的幾種方式。
Laravel 框架默認的登錄跳轉
LaravelIlluminateAuth 提供的身份認證系統默認配置了用戶登錄后的跳轉。在 config/auth.php 配置文件中,有如下默認配置:
'redirect' => [ 'login' => '/login', 'logout' => '/logout', 'home' => '/home', 'register' => '/register', 'verify' => '/email/verify', 'reset' => '/password/reset', 'confirm' => '/password/confirm', ],
其中,’home’ 表示登錄后的跳轉頁面,默認為 /home 路徑。如果需要修改默認跳轉頁面,只需要將該路徑修改為自己想要的頁面即可。
手動指定跳轉路徑
如果需要在控制器中手動指定登錄后的跳轉頁面,我們可以使用 Laravel 框架提供的 RedirectResponse 實例,通過 redirect() 方法實現。
例如,在用戶控制器中,我們可以重寫 IlluminateFoundationAuthAuthenticatesUsers trait 中的 authenticated() 方法:
use IlluminateSupportFacadesAuth; class UserController extends Controller { use AuthenticatesUsers; protected function authenticated(Request $request, $user) { return redirect()->route('user.show', $user->id); } }
上述代碼可以在用戶登錄成功后,跳轉到指定的用戶個人資料頁。
重定向到先前頁面
有時候,我們需要將用戶登錄后的跳轉路徑設置為登錄之前的頁面,可以使用 Laravel 提供的 Session() 函數和 URL::previous() 方法。
例如,在登錄控制器中,我們可以這樣實現:
use IlluminateHttpRequest; use IlluminateSupportFacadesAuth; use IlluminateSupportFacadesURL; class LoginController extends Controller { public function login(Request $request) { $credentials = $request->only('email', 'password'); if (Auth::attempt($credentials)) { return redirect()->intended(URL::previous()); } return back()->withErrors(['email' => '登錄失敗']); } }
在上述代碼中,我們使用了 redirect()->intended() 方法,該方法會將用戶重定向到登錄之前訪問的頁面。如果用戶之前沒有訪問過其他頁面,則會重定向至默認的登錄跳轉路徑。
使用中間件跳轉到指定頁面
Laravel 框架中間件提供了便捷的身份認證和授權功能。我們可以在某個中間件中指定登錄后的跳轉路徑。
例如,我們可以在 auth 中間件中配置登錄后的跳轉路徑:
namespace AppHttpMiddleware; use IlluminateAuthMiddlewareAuthenticate as Middleware; class Authenticate extends Middleware { protected function redirectTo($request) { if (! $request->expectsjson()) { return route('login'); // 設置默認的跳轉路徑 } } }
在上述代碼中,我們使用 redirectTo() 方法來處理登錄失敗的請求。如果請求時期望返回 json 格式數據,則直接返回 401 錯誤;否則,將用戶重定向到登錄頁面。
如果需要指定其他的跳轉路徑,只需要修改 return 語句中的路由別名即可。