YII2框架阅读随笔3
今天继续阅读vendor/yiisoft/yii2/web/User.php
protected function loginByCookie() //用户的日志。 { $value = Yii::$app->getRequest()->getCookies()->getValue($this->identityCookie['name']); //根据登录的Cookie中name字段取得用户的日志信息。 if ($value === null) { return; //如果$value的值为空,则返回。 } $data = json_decode($value, true); //用json_decode的方式对$value的值做处理,带上后缀的参数true.处理后的值用$data表示。 if (count($data) !== 3 || !isset($data[0], $data[1], $data[2])) { //如果$data里面的值得数量不等于3或者没有设置$data[0],$data[1],$data[2]里面的值,返回。 return; } list ($id, $authKey, $duration) = $data; //把$data中0,1,2下标的值分别赋给$id,$authKey,$duration. /* @var $class IdentityInterface */ $class = $this->identityClass; $identity = $class::findIdentity($id); //$identity由静态类方法调用,参数是$id。 if ($identity === null) { //如果$identity的值全等于null,则返回。 return; } elseif (!$identity instanceof IdentityInterface) { //如果$identity不符合IdentityInterface类中的运算,则抛出一个新的提示:必须返回一个对象。 throw new InvalidValueException("$class::findIdentity() must return an object implementing IdentityInterface."); } if ($identity->validateAuthKey($authKey)) { if ($this->beforeLogin($identity, true, $duration)) { //如果$this->beforeLogin($identity, true, $duration)有值,即$event->isValid有值,则走下面这一步。 $this->switchIdentity($identity, $this->autoRenewCookie ? $duration : 0); //三元运算符,如果$this->autoRenewCookie存在,则第二个参数为$duration,如果不存在,第二个参数为0.
$ip = Yii::$app->getRequest()->getUserIP(); //静态调用YII类,值赋值给$ip; Yii::info("User '$id' logged in from $ip via cookie.", __METHOD__);//信息内容为User '$id' logged in from $ip via cookie。 $this->afterLogin($identity, true, $duration); } } else { Yii::warning("Invalid auth key attempted for user '$id': $authKey", __METHOD__);//如果$identity->validateAuthKey($authKey)没值,返回错误信息。 } } public function logout($destroySession = true) //用户退出默认$destroySession为真。 { $identity = $this->getIdentity(); if ($identity !== null && $this->beforeLogout($identity)) {//如果这两个条件同时成立,那么就把$id,$ip的值得到。 $this->switchIdentity(null); $id = $identity->getId(); $ip = Yii::$app->getRequest()->getUserIP(); Yii::info("User '$id' logged out from $ip.", __METHOD__);//信息内容,这个id的用户注销。 if ($destroySession && $this->enableSession) { Yii::$app->getSession()->destroy(); //如果$destroySession为真并且$this->enableSession为真,调用静态方法销毁数据,达到退出的目的。 } $this->afterLogout($identity); } return $this->getIsGuest(); //调用getIsGuest方法,使$this->getIdentity()的值为null. } public function getIsGuest() { return $this->getIdentity() === null;//使$this-<getIdentity()的值全等于null. } public function getId() { $identity = $this->getIdentity(); return $identity !== null ? $identity->getId() : null; //返回 $identity,如果$identity不为null,返回$identity->getId();如果为null,返回null. } public function getReturnUrl($defaultUrl = null)//返回的网址,成功登陆后重定向的url. { $url = Yii::$app->getSession()->get($this->returnUrlParam, $defaultUrl);//url赋值。参数为$this->returnUrlParam,$defaultUrl. if (is_array($url)) { if (isset($url[0])) { //如果$url为数组并且$url[0]下标存在的话,返回一个重定向的url. return Yii::$app->getUrlManager()->createUrl($url); } else { $url = null; } } return $url === null ? Yii::$app->getHomeUrl() : $url;//三元运算符。 } public function setReturnUrl($url) { Yii::$app->getSession()->set($this->returnUrlParam, $url); } public function loginRequired($checkAjax = true) //将用户重定向浏览器到登录页面。 { $request = Yii::$app->getRequest(); //$request的值为访问静态类得到的值。 if ($this->enableSession && (!$checkAjax || !$request->getIsAjax())) { $this->setReturnUrl($request->getUrl()); } if ($this->loginUrl !== null) { //如果不为null,$loginUrl=$this->loginUrl强制转换为数组形式。 $loginUrl = (array) $this->loginUrl; if ($loginUrl[0] !== Yii::$app->requestedRoute) { return Yii::$app->getResponse()->redirect($this->loginUrl); } } throw new ForbiddenHttpException(Yii::t('yii', 'Login Required'));//抛出提示。 }