在yii中有一个Login操作,它需要
$model=new LoginForm;
存储所有登录函数的位置。比如$model->login()
,它完成了所有的认证过程。
现在当你注册时你采用不同的模型
$model=new User;
因为你必须在用户数据库中存储新用户。
那么我如何在singup过程中将LoginForm合并到$model中以使用它的功能?因为我希望通过注册过程的用户自动登录。例如,我需要$model->login()
代码,它存储在LoginForm
就像我在Login action中说的,有一个字符串如果(模型-> validate (),,模型->登录())
所以使用提供Jonny的链接我已经从这个
更新了一些代码 if($model->validate())
{
if($model->save())
变成这样
if($model->validate())
{
$identity=new LoginForm($model->username,$model->password);
$identity->login();
if($model->save())
所以现在理论上我正在创建新的对象标识,传递用户名和密码给它,并调用登录函数。必须与"登录动作"相同。但是这个新用户还没有登录。
这里是完整的登录操作代码
public function actionLogin()
{
$model=new LoginForm;
// if it is ajax validation request
if(isset($_POST['ajax']) && $_POST['ajax']==='login-form')
{
echo CActiveForm::validate($model);
Yii::app()->end();
}
// collect user input data
if(isset($_POST['LoginForm']))
{
$model->attributes=$_POST['LoginForm'];
// validate user input and redirect to the previous page if valid
if($model->validate() && $model->login())
$this->redirect(Yii::app()->user->returnUrl);
}
// display the login form
$this->render('login',array('model'=>$model));
}
还张贴了登录函数的代码,该代码保存在LoginForm
public function login()
{
if($this->_identity===null)
{
$this->_identity=new UserIdentity($this->username,$this->password);
$this->_identity->authenticate();
}
if($this->_identity->errorCode===UserIdentity::ERROR_NONE)
{
$duration=$this->rememberMe ? 3600*24*30 : 0; // 30 days
Yii::app()->user->login($this->_identity,$duration);
return true;
}
else
return false;
}
感谢Jonny,大家阅读他在评论中提供的链接,这是解决方案。
$identity=new LoginForm();
$identity->username=$model->username;
$identity->password=$model->password;
if($model->save()) {
$identity->login();
只能像我一样手动发送用户名和模型,而不是像那个链接中那样,主要的事情是在触发登录函数之前在数据库中注册用户,因为登录函数会调用另一个家伙来检查数据库中是否有这个新用户。