欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

Laravel小技巧 Laravel 实现多字段登录 用户名姓名手机邮箱 密码登录 有大用

shiping1 的头像


Laravel 实现多字段登录

 |  Laravel |  2 条评论 |  (9评| 

现在很多网站都提供了这样的功能,用户可以通过邮箱、手机号或者昵称来登录网站,下面是在 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. }


/app/Http/Controllers/Auth/AuthController.php  验证
return
Validator::make($data, [
   'name' => 'required|max:255|unique:users',
   'email' => 'required|email|max:255|unique:users',
   'password' => 'required|min:6|confirmed',
   'tel' => 'required|digits:11|unique:users',
]);

/app/Http/Controllers/Auth/AuthController.php 创建用户
protected function create(array $data)
{
   return User::create([
       'name' => $data['name'],
       'email' => $data['email'],
       'tel' => $data['tel'],
       'password' => bcrypt($data['password']),
   ]);
}


/app/user.php 模型
protected $fillable = [
   'name', 'email', 'password','tel'
];

/app/login.blade.php 模板视图
<input type="text" class="form-control" placeholder="邮箱/帐号/手机号" name="login" id="userName" value="{{ old('login') }}" />

@if ($errors->has('login'))
   <span id="email_error_count" style="font-size: 12px;color: #f03b0d;">{{ $errors->first('login') }}</span>
@endif

/app/register.blade.php 模板视图
<div class="form-group{{ $errors->has('tel') ? ' has-error' : '' }}">
   <label for="tel" class="col-md-4 control-label">Tel</label>

   <div class="col-md-6">
       <input id="tel" type="text" class="form-control" name="tel" value="{{ old('tel') }}">

       @if ($errors->has('email'))
           <span class="help-block">
               <strong>{{ $errors->first('tel') }}</strong>
           </span>
       @endif
   </div>
</div>


2019_08_13_100950_add_tel_to_users.php  migration
Schema::table('users', function (Blueprint $table) {
   //
   $table->string('tel',20)->unique();
});



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. }

 


该篇属于专题:《Laravel小技巧


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

普通分类: