Код: Выделить всё
"name": "PHP Recoverable Error",
"message": "Argument 1 passed to yii\\web\\User::login() must implement interface yii\\web\\IdentityInterface, null given, called in C:\\WebServers\\home\\site.local\\frontend\\models\\LoginForm.php on line 31 and defined",
"code": 4096,
"type": "yii\\base\\ErrorException",
"file": "C:\\WebServers\\home\\site.local\\vendor\\yiisoft\\yii2\\web\\User.php",
"line": 238,
"stack-trace": [
"#0 C:\\WebServers\\home\\site.local\\vendor\\yiisoft\\yii2\\web\\User.php(238): yii\\base\\ErrorHandler->handleError(4096, 'Argument 1 pass...', 'C:\\\\WebServers\\\\h...', 238, Array)",
"#1 C:\\WebServers\\home\\site.local\\frontend\\models\\LoginForm.php(31): yii\\web\\User->login(NULL, 0)",
"#2 C:\\WebServers\\home\\site.local\\frontend\\controllers\\SiteController.php(185): frontend\\models\\LoginForm->login()",
"#3 [internal function]: frontend\\controllers\\SiteController->actionLogin()",
"#4 C:\\WebServers\\home\\site.local\\vendor\\yiisoft\\yii2\\base\\InlineAction.php(57): call_user_func_array(Array, Array)",
"#5 C:\\WebServers\\home\\site.local\\vendor\\yiisoft\\yii2\\base\\Controller.php(156): yii\\base\\InlineAction->runWithParams(Array)",
"#6 C:\\WebServers\\home\\site.local\\vendor\\yiisoft\\yii2\\base\\Module.php(523): yii\\base\\Controller->runAction('login', Array)",
"#7 C:\\WebServers\\home\\site.local\\vendor\\yiisoft\\yii2\\web\\Application.php(102): yii\\base\\Module->runAction('site/login', Array)",
"#8 C:\\WebServers\\home\\site.local\\vendor\\yiisoft\\yii2\\base\\Application.php(380): yii\\web\\Application->handleRequest(Object(yii\\web\\Request))",
"#9 C:\\WebServers\\home\\site.local\\frontend\\web\\index.php(24): yii\\base\\Application->run()",
"#10 {main}"
]
Код: Выделить всё
public function actionLogin() {
// if (Yii::$app->request->isAjax) {
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
if (!Yii::$app->user->isGuest)
return ['error' => 'unable_login'];
$modelLoginForm = new LoginForm();
if ($modelLoginForm->load(Yii::$app->request->post())) {
if ($user = $modelLoginForm->login()) {
return ['error' => 'ok', 'user_email' => $user->email];
}
else
return ['error' => 'login_error'] + $modelLoginForm->errors;
}
// }
return $this->redirect(['site/index']);
}
Код: Выделить всё
namespace frontend\models;
use Yii;
use yii\base\Model;
use common\models\Users;
class LoginForm extends Model {
public $email,
$password,
$rememberMe;
private $_user;
public function rules() {
return [
[['email', 'password'], 'required', 'message' => 'empty_field'],
[['email', 'password'], 'trim'],
];
}
public function login() {
if ($this->validate())
return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600 * 24 * 30 : 0); //$this->_user;
else
return FALSE;
}
/**
* Finds user by email or id
*
* @return User|null
*/
protected function getUser() {
if ($this->_user === null) {
$this->_user = Users::findByUsername($this->email);
}
return $this->_user;
}
}
Опытным путём выяснил, что в оригинале в функции LoginForm->login() при неверных данных (т.е. когда пользователь не найден), функция $this->validate() возвращает false и в $model->errors содержится вот такое:
Код: Выделить всё
{
["password"]=> array(1)
{
[0]=> string(31) "Incorrect username or password."
}
}
у меня же, $this->validate() возвращает true и соотв дальше в Yii::$app->user->login передаётся вместо найденного пользователя null, что и вызывает ошибку. Я пока выкрутился вот так:
Код: Выделить всё
public function login() {
if ($this->validate() && !is_null($this->_user = $this->getUser())) {
if (Yii::$app->user->login($this->_user, $this->rememberMe ? 3600 * 24 * 30 : 0));
return $this->_user;
}
return FALSE;
}