error: вызов функции-члена validatePassword () для не-объекта (yii2)

Я новичок в этой структуре, и это первый раз, когда я использую фреймворк. Может кто-нибудь помочь мне в этой ошибке? Я не знаю, как исправить эту ошибку. вот мой код:

User.php:

<?php namespace app\models; use Yii; class User extends \yii\db\ActiveRecord implements \yii\web\IdentityInterface { public $id; public $username; public $password; public $authKey; public $accessToken; public static function tableName() { return 'user_file'; } /** * @inheritdoc */ public static function findIdentity($id) { return isset(self::$users[$id]) ? new static(self::$users[$id]) : null; } /** * @inheritdoc */ public static function findIdentityByAccessToken($token, $type = null) { foreach (self::$users as $user) { if ($user['accessToken'] === $token) { return new static($user); } } return null; } /** * Finds user by username * * @param string $username * @return static|null */ public static function findByUsername($username) { $user = User::find() ->where(['usr_id' => $username]) ->all(); return $user; } /** * @inheritdoc */ public function getId() { return $this->id; } /** * @inheritdoc */ public function getAuthKey() { return $this->authKey; } /** * @inheritdoc */ public function validateAuthKey($authKey) { return $this->authKey === $authKey; } /** * Validates password * * @param string $password password to validate * @return boolean if password provided is valid for current user */ public function validatePassword($password) { return $this->password === $password; } } 

LoginForm.php

 <?php namespace app\models; use Yii; use yii\base\Model; /** * LoginForm is the model behind the login form. */ class LoginForm extends Model { public $username; public $password; public $rememberMe = true; private $_user = false; /** * @return array the validation rules. */ 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 boolean whether the user is logged in successfully */ public function login() { if ($this->validate()) { return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600*24*30 : 0); } else { return false; } } /** * Finds user by [[username]] * * @return User|null */ public function getUser() { if ($this->_user === false) { $this->_user = User::findByUsername($this->username); } return $this->_user; } } 

Правильно ли мой код User.php? Я действительно не знаю, проблема с моим кодом может кто-нибудь объяснить мне, что происходит?

Согласно http://www.yiiframework.com/doc-2.0/yii-db-activequery.html#all()-detail all () возвращает массив. В findByUsername () вы возвращаете этот массив. Вот почему вы получаете вызов отсутствующей ошибки функции члена, поскольку массив не является объектом. Попробуйте вернуться -> one () вместо all ():

 public static function findByUsername($username) { $user = User::find() ->where(['usr_id' => $username]) ->one(); return $user; } 

Используйте $user = new User(); insted из $user = $this->getUser(); и вызовите метод как $ user-> getUser () в вашем методе validatePassword () в LoginForm.php

Ты делаешь –

 $user = $this->getUser(); if (!$user || !$user->validatePassword($this->password)) { 

Что задает $user из –

 public function getUser() { if ($this->_user === false) { $this->_user = User::findByUsername($this->username); } return $this->_user; } 

Где findByUsername() – метод класса Model . В этом случае $user не является экземпляром класса User .

Попробуйте –

 if (!$user || !User::validatePassword($this->password)) {