Laravel技巧库

用户名登录

此课程是收费课程,请先购买或加入会员后再访问。

使用邮箱登录,有的用户可能会觉得这个太长了,太麻烦,最好能有个用户名登录。那么这一集就来实现这个功能。

登录

controller

再注意看,这里还有一个$this->username(),还是点进去看看,会发现有这么一个方法

public function username()
{
    return 'email';
}

这里也就是说laravel默认是使用email来做登录认证的,那么我们把这个方法复制到LoginController,将他改为

public function username()
{
    return 'username';
}

migration

但目前数据库中users表中,还没有username这个字段,那么我们新建一个migration来添加它。这里之所以不使用数据库中已经存在的name字段,这是因为name我们后面学到qq登录,它还有其他的作用。

php artisan make:migration add_username_to_users_table --table=users
class AddUsernameToUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('username')->nullable()->unique();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('username');
        });
    }
}

Tips: unique是用来添加唯一索引的

接着不要忘记了,修改login.blade.php中的email部分,把它覆盖为username相关的表单

view

<div class="am-form-group am-form-icon am-form-feedback {{ $errors->has('username') ? ' am-form-error' : '' }}">
    <label class="am-form-label" for="username">用户名: </label>
    <input type="text" id="username" name="username" class="am-form-field" placeholder="输入你的用户名" value="{{old('username')}}">

    @if ($errors->has('username'))
        <span class="am-icon-warning">{{$errors->first('username')}}</span>
    @endif
</div>

现在我们直接使用工具修改users表,给以前的注册的用户,添加一个真实的username
好的,来测试一下,就这么简单,现在就可以使用用户名来登录了。

注册

别忘了,现在用户注册页面,还没有username相关的表单。

view

用户注册部分的模板register.blade.php也要添加username的表单,而原来的name部分就改为昵称

<div class="am-form-group am-form-icon am-form-feedback {{ $errors->has('name') ? ' am-form-error' : '' }}">
    <label class="am-form-label" for="name">昵称: </label>
    <input type="text" id="name" class="am-form-field" placeholder="输入你的昵称" name="name" value="{{ old('name') }}">

    @if ($errors->has('name'))
        <span class="am-icon-warning">{{$errors->first('name')}}</span>
    @endif
</div>

<div class="am-form-group am-form-icon am-form-feedback {{ $errors->has('username') ? ' am-form-error' : '' }}">
    <label class="am-form-label" for="username">用户名: </label>
    <input type="text" id="username" class="am-form-field" placeholder="输入你的用户名" name="username" value="{{ old('username') }}">

    @if ($errors->has('username'))
        <span class="am-icon-warning">{{$errors->first('username')}}</span>
    @endif
</div>

controller

控制器的数据验证和新增数据的代码中,都要添加username相关的代码

class RegisterController extends Controller
{
    //...

    protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => 'required|string|max:255',
            'username' => 'required|string|max:255|unique:users',
            'email' => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|min:6|confirmed',
        ]);
    }

    protected function create(array $data)
    {
        return User::create([
            'name' => $data['name'],
            'username' => $data['username'],
            'email' => $data['email'],
            'password' => bcrypt($data['password']),
        ]);
    }
}

Tips: 关于数据验证,后面有一章会专门讲解这个问题,现在就先照着改就好了。
unique:users的意思是,users表中,不能有重复的username

model

app/User.php中,修改一下白名单

protected $fillable = [
    'name', 'email', 'password', 'username'
];