2016年10月4日 星期二

Laravel 实现多字段登录

现在很多网站都提供了这样的功能,用户可以通过邮箱、手机号或者昵称来登录网站,下面是在 Laravel (以 5.1 为例)中实现该功能的方式。
下面三种方法基本原理都是相同的。

1. 方法一

使用 Laravel 自带认证系统,修改 /app/Http/Controllers/Auth/AuthController.php 文件,重写方法(原方法所在文件 /vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php):
  1. namespace App\Http\Controllers\Auth;
  2. ......
  3. use Illuminate\Http\Request; // 增加该行
  4.  
  5. class AuthController extends Controller
  6. {
  7. protected $username = 'login';
  8.  
  9. ....
  10.  
  11. protected function getCredentials(Request $request)
  12. {
  13. $login = $request->get('login');
  14. $field = filter_var($login, FILTER_VALIDATE_EMAIL) ? 'email' : 'name';
  15.  
  16. return [
  17. $field => $login,
  18. 'password' => $request->get('password'),
  19. ];
  20. }
  21. }

2. 方法二

修改 /app/Http/Controllers/Auth/AuthController.php 文件,这也是使用 Laravel 自带认证系统的一种方法。
  1. namespace App\Http\Controllers\Auth;
  2. ......
  3. use Illuminate\Http\Request; // 增加该行
  4.  
  5. class AuthController extends Controller
  6. {
  7.  
  8. // 修改这里
  9. use AuthenticatesAndRegistersUsers, ThrottlesLogins {
  10. AuthenticatesAndRegistersUsers::postLogin as laravelPostLogin;
  11. }
  12.  
  13. ......
  14.  
  15. // 增加方法
  16. public function postLogin(Request $request)
  17. {
  18. $field = filter_var($request->input('login'), FILTER_VALIDATE_EMAIL) ? 'email' : 'name';
  19. $request->merge([$field => $request->input('login')]);
  20. $this->username = $field;
  21.  
  22. return self::laravelPostLogin($request);
  23. }
  24. }

3. 方法三

重写登录功能
LoginRequest.php:
  1. public function rules()
  2. {
  3. return [
  4. 'login' => 'required',
  5. 'password' => 'required'
  6. ];
  7. }
AuthController.php:
  1. public function login(LoginRequest $request)
  2. {
  3. $field = filter_var($request->input('login'), FILTER_VALIDATE_EMAIL) ? 'email' : 'username';
  4. $request->merge([$field => $request->input('login')]);
  5.  
  6. if ($this->auth->attempt($request->only($field, 'password')))
  7. {
  8. return redirect('/');
  9. }
  10.  
  11. return redirect('/login')->withErrors([
  12. 'error' => 'These credentials do not match our records.',
  13. ]);
  14. }


from : http://9iphp.com/web/laravel/log-in-with-username-or-email-in-laravel-5.html

沒有留言:

wibiya widget