现在很多网站都提供了这样的功能,用户可以通过邮箱、手机号或者昵称来登录网站,下面是在 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.',
- ]);
- }
from : http://9iphp.com/web/laravel/log-in-with-username-or-email-in-laravel-5.html
沒有留言:
張貼留言