现在很多网站都提供了这样的功能,用户可以通过邮箱、手机号或者昵称来登录网站,下面是在 Laravel (以 5.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'), ]; }}
修改 /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); }}
重写登录功能
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小技巧》