这里有新鲜出炉的精品教程,程序狗速度看过来!
Yii 2 完全根据 Yii 1.1 版本重写,后者是最流行的 PHP 框架之一。Yii 2 继承了 Yii 的简洁、快速、和高扩展性。Yii 2 需要 PHP 5.4,并且拥有现代 web 应用开发中最好的实例和协议。
这篇文章主要介绍了 Yii2 框架实现注册和登录教程的相关资料, 需要的朋友可以参考下
注册
在 advanced 模板中,进入 frontend/index.php?r=site/signup 页面,可以看到框架的注册页面
填写完 Username、Email 和 Password 后点击 Signup 后,如果格式不对,frontend/models/SignuForm 中的 rules() 函数会进行初步验证,所有格式正确后,数据传输到 frontend/controllers /SiteController 中的 actionSignup() 函数中,函数加载用户输入的注册信息,在 frontend/models/SignupForm 中的 signup() 函数,
以下引用的文字为解释函数中的具体细节,不阅读不影响整体,因为没有折叠文字功能,故采用引用的方法,下同
- if (!$this - >validate()) {
- return null;
- }
signup() 函数首先调用 yii2/base/Model 中的 validate() 函数进行验证
第一步,清除使用 frontend/models/SignuForm 中的 rules() 函数在用户输入时的错误信息
- if ($clearErrors) {
- $this - >clearErrors();
- }
第二步,beforeValidate() 函数触发 beforeValidate 事件并返回 true
第三步,设置 scenario,默认是 default
第四步,因为这里的 $attributeNames 为 null,
- $attributeNames = $this - >activeAttributes();
执行后返回
- array(3) { [0]=> string(8) "username" [1]=> string(5) "email" [2]=> string(8) >"password" }
第五步,$this->getActiveValidators() 会得到 frontend/models/SignuForm 中的 rules() 中 11 条验证规则给 validateAttributes() 进行验证
第六步,执行 afterValidate() 函数触发 afterValidate 事件
最后 如果所有验证都通过,$this->hasErrors() 为 false,所以函数最后返回 true
我们看一下数据表 user 的字段
用户输入了 username、password 和 email,Yii2 框架是如何生成其他的字段的呢,先看 password_hash,在 SignupFrom 中的 signup 函数中的密码生成是 setPassword 函数,该函数在 common/models/User 中,setPassword 函数调用了 yii2/base/Security 中的每一条规则 generatePasswordHash 函数。
- if (function_exists('password_hash')) {
- /** @noinspection PhpUndefinedConstantInspection */
- return password_hash($password, PASSWORD_DEFAULT, ['cost' = >$cost]);
- }
如果有,就使用 password_hash 函数进行加密,如果 PHP 没有 password_hash 函数,就使用 crypt 函数加密,初步判断应该是为了兼容 PHP 低于 5.5 的版本,毕竟大于 5.5 的版本才开始有 password_hash 函数
common/models/User 的 signup() 函数在对 password 加密后,就会继续生成一个 auth key,auth key 是当用户在登录的时候点击 remember me 的时候的验证信息,
auth key 生成的方法也是在 yii2/base/Security 中的 generateRandomString,generateRandomString 调用 generateRandomKey 函数,如果你的 PHP 版本为是 5.2~5.6 或者是 7,那就是用 random_bytes 生成一个 32 个字节的字符串,如果不是,当你用的系统时 windows 并且安装了 OpenSSL,就会调用 openssl_random_pseudo_bytes 函数生成,如果你未安装 OpenSSL,就会使用 mcrypt_create_iv 生成。
如果你使用的系统不是 windows,就需要调用 / dev/urandom,FreeBSD 系统特殊,会调用 / dev/random,然后调用 stream_set_read_buffer 方法生成 8 字节的字符文件,生成后,通过 fread 函数读取该文件中的 32 个字节,然后返回该数据。
password_reset_token 在用户注册的时候是为空的,当用户忘记密码在登录页面点击 reset it 后生成的,用来给用法发送邮件后重置密码时进行验证。
status 在 common/models/User 中定义的
const STATUS_DELETED = 0;
const STATUS_ACTIVE = 10;
用户注册时 rules 中的 status 默认为为 10,
created_time 和 updated_time 也是在 common/models/User 中的 behaviors() 函数中生成
用户的数据验证合格,加上框架生成的数据,然后存储进数据的 user 表里。
登录
关于 frontend/controllers/SiteController 中的 actionSignup() 中的
- if (Yii: :$app - >getUser() - >login($user)) {
- return $this - >goHome();
- }
就是用户注册后,这时该用户的数据已经写入数据库了,开始登录的过程了
登录的过程在 yii2/web/User 里的 login() 函数中
第一步,执行 beforeLogin() 函数触发 beforeLogin 事件
第二步,switchIdentity() 函数把个人信息换成当前用户的信息,把所有的 cookie 都销毁,然后把当前用户的信息都存入到 session 和 cookie 中
第三步,获取当前用户的 id 和用户登录的 ip,并写入到 log 中
第四步,执行 afterLogin() 函数触发 afterLogin 事件
最后 返回 true
判断登录成功后,return $this->goHome(); 跳转到主页。
来源: http://www.phperz.com/article/17/0825/342338.html