現在很多網站都提供了這樣的功能,使用者可以通過郵箱、手機號或者暱稱來登入網站,下面是在 Laravel (以 5.1 為例)中實現該功能的方式。
下面三種方法基本原理都是相同的。
1. 方法一
使用 Laravel 內建認證系統,修改 /app/Http/Controllers/Auth/AuthController.php 檔案,重寫方法(原方法所在檔案 /vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php):
namespace App\Http\Controllers\Auth;......use Illuminate\Http\Request; // 增加該行class AuthController extends Controller{ protected $username = 'login'; .... protected function getCredentials(Request $request) { $login = $request->get('login'); $field = filter_var($login, FILTER_VALIDATE_EMAIL) ? 'email' : 'name'; return [ $field => $login, 'password' => $request->get('password'), ]; }}
2. 方法二
修改 /app/Http/Controllers/Auth/AuthController.php 檔案,這也是使用 Laravel 內建認證系統的一種方法。
namespace App\Http\Controllers\Auth;......use Illuminate\Http\Request; // 增加該行class AuthController extends Controller{ // 修改這裡 use AuthenticatesAndRegistersUsers, ThrottlesLogins { AuthenticatesAndRegistersUsers::postLogin as laravelPostLogin; } ...... // 增加方法 public function postLogin(Request $request) { $field = filter_var($request->input('login'), FILTER_VALIDATE_EMAIL) ? 'email' : 'name'; $request->merge([$field => $request->input('login')]); $this->username = $field; return self::laravelPostLogin($request); }}
3. 方法三
重寫登入功能
LoginRequest.php:
public function rules(){ return [ 'login' => 'required', 'password' => 'required' ];}
AuthController.php:
public function login(LoginRequest $request){ $field = filter_var($request->input('login'), FILTER_VALIDATE_EMAIL) ? 'email' : 'username'; $request->merge([$field => $request->input('login')]); if ($this->auth->attempt($request->only($field, 'password'))) { return redirect('/'); } return redirect('/login')->withErrors([ 'error' => 'These credentials do not match our records.', ]);}
該篇屬於專題:《Laravel小技巧》
- 上一篇: 《 Laravel更改登入時使用的預設欄位名稱email》