当我们做一个项目的时候,我们通常会创建一个会员系统,例如有管理员,普通会员,内容发布者等等,这些会员有不同的权限和角色,可以注册新会员,登录等功能。Laravel让这一过程变得异常简单,只要用一个简单的命令,便可以创建一个基本的会员系统(基本框架),简称脚手架。在版本6之前,做脚手架的命令是这样的:
php artisan make:auth
但是我们到了6的版本之后,这个命令不存在了。在版本6的时候,Laravel把这个脚手架放到了单独的composer包laravel/ui里面,所以想安装脚手架要首先用composer安装laravel/ui这个包。安装完laravel项目之后执行这个命令:
composer require laravel/ui --dev
php artisan ui vue --auth
--dev表明是在开发环境中用这个包。下面一句可以生成有登录和注册页面组成的脚手架,如果没有--auth就可以生成基本的脚手架。vue其实可以换成react,这样的话就用react来做前端框架了。laravel默认前端已经自带了Bootstrap,所以生成脚手架的时候也会自动包含这个框架。
上面的只是在前端的部分,还没有生成后端的数据库的部分。其实在Laravel默认安装的时候就已经有了这个认证系统的控制器和视图。只要运行这个命令便可以生成数据库结构,当然你要确保.env文件里面的数据库名,用户名和密码是正确的。
php artisan migrate
命令执行结束以后,试试看能不能正常注册吧。在脚手架的注册页面,默认有这么几个字段,name, e-mail, password,confirm-password。登录的时候默认是用邮箱来登录的,那么我们如何在上面加一个(username)用户名这个字段,并且在登录的时候用用户名或者邮箱来登录呢?
首先,我们在前端的注册页面加下这个字段,找到并打开resources/views/auth/register.blade.php这个文件,从14行至26行可以看见一组字段的代码,我们把这个代码复制一遍,并把相应的字段名称修改下,例如把name全改成username。用下面的命令添加一个新字段到数据库创建文件,也就是database/migrations文件夹下面的文件。
php artisan make:migration add_extra_field_to_users_table --table=users
上面的命令会为users这个数据表添加一个新的字段,注意下这个部分,users_table
--table=users,可以变换下数据库名称。这样在database/migrations文件夹下面生成一个新的文件,打开这个文件添加一行字段文件生成语句。因为用户名是有唯一性的,所以加了一个unique()。
string('username')->unique();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('users', function (Blueprint $table) {
//删除这个字段
$table->dropColumn('username');
});
}
}
然后再运行一次
php artisan migrate
这样就可以添加这个字段到这个表里。当然我们也有第二种方法,也就是直接在原来的数据库生产文件里添加, 在17,18行中间:
$table->bigIncrements('id');
$table->string('username')->unique();
$table->string('name');
然后运行 php artisan migrate:refresh命令就可以了,要跟php artisan migrate:fresh这个命令区别开来。
refresh和fresh命令的区别在于:fresh命令不按照migrations表里的记录逐步回滚,而是通过删除数据库里所有表来跳过还原和回滚的步骤,然后在空数据库上执行每个 migration 文件里的up方法。refresh这个相当于做了修改。下面我们来添加验证规则,在app/Http/Controllers/Auth/RegisterController.php里面,
'username' => ['required', 'string', 'min:6', 'max:255','unique:users'],
接下来我们修改下控制器,找到控制器文件:Http/Controllers/Auth/RegisterController.php, 添加这个字段,在68和70行中间,加一行:
'username' => $data['username'],
这句放在52行的下面。不用说,这些验证规则很清晰。最后我们修改下模型文件app/user.php里的批量赋值属性,否则数据无法录入。在27至29行中间添加:
protected $fillable = [
'name', 'email', 'username','password',
];
现在,我们来试下的话发现我们能正常注册了。我们来总结下,添加新字段的步骤:
1.修改视图文件,添加字段输入口 2.修改控制器,添加字段。 3. 修改验证规则,添加对这个字段的验证规则。4.修改模型文件,对批量赋值进行修改。 5. 添加一个新字段,然后运行一下数据库文件。
接下来,我们还要进行用用户名进行登录的修改。我们要把它改成既可以用邮箱登录,也可以用用户名登录。
如果我们要达到这个效果,就要修改logincontroller里面的username方法,我们可以直接在里面覆盖这个方法:
public function username()
{
$login = request()->input('login');
$field = filter_var($login, FILTER_VALIDATE_EMAIL) ? 'email' : 'username';
request()->merge([$field => $login]);
return $field;
}
//如果只用一个手机号码登录,那么就是这样的
public function username()
{
return 'cellphone';
//这里cellphone是字段名
}
首先在前端,目前只允许输入邮箱,不能输入用户名,所以要修改成统一的字段名,为login。在18行,我们将其改成:
添加验证码
验证码是很必要的安全措施,很多网站都是必备的。在此我们在注册表单的底部加一个验证码来确保用户是真人注册的。我们在此会用到一个composer包,现在我们来安装一下:
composer require "mews/captcha:~3.0"
运行以下命令生成配置文件 config/captcha.php:
php artisan vendor:publish --provider='Mews\Captcha\CaptchaServiceProvider'
配置文件其实不用管了,接下来我们要添加一个验证机制,在注册控制器里。
protected function validator(array $data)
{
return Validator::make($data, [
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => ['required', 'string', 'min:6', 'confirmed'],
'captcha' => ['required', 'captcha'],
], [
'captcha.required' => '验证码不能为空',
'captcha.captcha' => '请输入正确的验证码',
]);
}
captcha的验证规则是captcha和required, 然后把错误信息写上,Validate::make这个方法接受三个变量,第一是数据,第二是验证规则(数组),第三是错误信息(数组)。
在前端展示的时候是这样的,这里只作为参考:
@if ($errors->has('captcha'))
{{ $errors->first('captcha') }}
@endif
现在试下我们能不能用用户名和邮箱登录吧!如果文章中有些错误,欢迎批评指正。