欢迎各位兄弟 发布技术文章
这里的技术是共享的
现在很多网站都提供了这样的功能,用户可以通过邮箱、手机号或者昵称来登录网站,下面是在 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 验证
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();
});
修改 /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小技巧》
http://9iphp.com/web/laravel/log-in-with-username-or-email-in-laravel-5.html