问题描述
我编写了自己的 Users
模型,它扩展了 ActiveRecord
并实现了 IdentityInterface
并定义了表名。并实现了所有方法。
Users.PHP
public static function tableName()
{
return 'users';
}
// other methods are also present like rules(),getId() etc.
UserController.PHP
public function actionLogin()
{
$this->layout = 'blank';
if (!Yii::$app->myuser->isGuest) {
return 'hello';
}
$model = new UserLoginForm();
if ($model->load(Yii::$app->request->post()) && $model->login()) {
return $this->redirect(['user/view','id' => $model->getUser()->id,]);
} else {
$model->password = '';
return $this->render('login',[
'model' => $model,]);
}
}
<?PHP
namespace backend\models;
use Yii;
use yii\base\Model;
class UserLoginForm extends Model
{
public $username;
public $password;
public $rememberMe = true;
private $_user;
/**
* {@inheritdoc}
*/
public function rules()
{
return [
// username and password are both required
[['username','password'],'required'],// rememberMe must be a boolean value
['rememberMe','boolean'],// password is validated by validatePassword()
['password','validatePassword'],];
}
/**
* Validates the password.
* This method serves as the inline validation for password.
*
* @param string $attribute the attribute currently being validated
* @param array $params the additional name-value pairs given in the rule
*/
public function validatePassword($attribute,$params)
{
if (!$this->hasErrors()) {
$user = $this->getUser();
if (!$user || !$user->validatePassword($this->password)) {
$this->addError($attribute,'Incorrect username or password.');
}
}
}
/**
* Logs in a user using the provided username and password.
*
* @return bool whether the user is logged in successfully
*/
public function login()
{
if ($this->validate()) {
return Yii::$app->myuser->login($this->getUser());
}
return false;
}
/**
* Finds user by [[username]]
*
* @return Users|null
*/
public function getUser()
{
if ($this->_user === null) {
$this->_user = Users::findByUsername($this->username);
}
return $this->_user;
}
}
'myuser' => [
'class' => 'yii\web\User','identityClass' => 'backend\models\Users','enableAutoLogin' => true,'identityCookie' => ['name' => '_identity-backend_user','httpOnly' => true],],
The table does not exist: {{%user}}
我发现它正在调用 common/models/User.PHP 类,该类默认存在于高级模板中。但是为什么要调用这个类呢?我想使用我自己的 Users.PHP 模型。请有人帮我解决这个问题。
解决方法
根据 Yii2 指南的 user,用于身份验证的类由 authentication section 应用程序组件确定:
用户应用程序组件管理用户身份验证状态。它要求您指定一个包含实际身份验证逻辑的身份类。在以下应用程序配置中,用户的身份类配置为 app\models\User,其实现将在下一小节中说明:
当您配置新的 myuser
组件时,框架仍然使用默认配置的 user
组件,更新您的代码,因此它会覆盖 user
组件,而不是创建一个新的 myuser
。
'user' => [
// Points to your custom class
'identityClass' => 'backend\models\Users','enableAutoLogin' => true,'identityCookie' => ['name' => '_identity-backend','httpOnly' => true],],