Почему id всегда 1 Yii2 — yii авторизация

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд
Загрузка...

Вопрос:


Использую все как по документации. Для получения информации о пользователе использую

$identity = $model->findOne(['email' => $_POST['User']['email']]);

И каким бы не был email, id пользователя всегда 1
Почему? Мне надо знать правильный, весь функционал на этом завязан

Описание класса User

<?php
namespace commonmodelsaccounts;

use yiidbActiveRecord;
use yiiwebIdentityInterface;
use Yii;

class User extends ActiveRecord implements IdentityInterface
{

public $password_repeat;

public static function tableName()
{
    return 'user';
}

public function rules(){
    return [];
}

public function attributeLabels()
{
    return [
        'email' => 'Email',
        'password_hash' => 'Пароль',
        'password_repeat' => 'Повторите пароль',
        'sid' => 'Школа',
        'type' => 'Тип пользователя'
    ];
}

/**
 * Finds an identity by the given ID.
 *
 * @param string|integer $id the ID to be looked for
 * @return IdentityInterface|null the identity object that matches the given ID.
 */
public static function findIdentity($id)
{
    return static::findOne($id);
}

/**
 * Finds an identity by the given token.
 *
 * @param string $token the token to be looked for
 * @return IdentityInterface|null the identity object that matches the given token.
 */
public static function findIdentityByAccessToken($token, $type = null)
{
    return static::findOne(['access_token' => $token]);
}

/**
 * @return int|string current user ID
 */
public function getId()
{
    return $this->id;
}

/**
 * @return string current user auth key
 */
public function getAuthKey()
{
    return $this->auth_key;
}

/**
 * @param string $authKey
 * @return boolean if auth key is valid for current user
 */
public function validateAuthKey($authKey)
{
    return $this->getAuthKey() === $authKey;
}

public function beforeSave($insert)
{
    if (parent::beforeSave($insert)) {
        if ($this->isNewRecord) {
            $this->auth_key = Yii::$app->security->generateRandomString();
        }
        return true;
    }
    return false;
}

static public function getUserType()
{
    return [
        -1 => 'Не проверен',
        0 => 'admin',
        1 => 'Директор',
        2 => 'Завуч',
        3 => 'Методист',
        4 => 'Тренер',
        5 => 'Спортсмен',
        6 => 'Опекун'
    ];
}

static public function getUserTypeForPublic($exclude = false)
{
    $userTypes = self::getUserType();
    $newUserType = array();
    for ($i = 1; $i <= 4; $i++)
    {
        $newUserType[$i] = $userTypes[$i];
    }

    return $newUserType;
}
}

Автор вопроса: Diefair

Понятно — что нужно детально отлаживать, такого быть не должно разумеется.
Только вызывайте пожалуйста метод для получения юзера по email так:

$identity = User::findIdentity(['email' => $_POST['User']['email']]);
/*Правда метод findIdentity - расчитывает на тип аргумента string|integer - указано в его phpdoc. 
А User::findOne - может принимать и массив - тогда лучше использовать findOne.
 */

$identity — по мне так не слишком очевидное название модели пользователя, по названию кажется что это числовой id, но возможно в yii так принято. Возможно ошибка как-раз в том, что вы каким-то кривым образом сконструировали $model до получения собственно модели, которая вас интересует ( $identity ). Попробуйте убрать создание $model

Если не поможет, нужно проверить:
1. Структуру таблицы user — в таблице пользователя должны быть колонки email (UK) , id (PK, AI)
2. $_POST['User']['email'] — проверьте, не пустая ли переменная.
3. Проверьте, не переопределён ли в цепочке наследования (которая должна быть User -> ActiveRecord -> BaseActiveRecord -> Model -> Component -> Object ) метод __get — переопределение может искажать реальные данные. Обратите внимание на код исходного метода __get в BaseActiveRecord :

public function __get($name)
    {
        if (isset($this->_attributes[$name]) || array_key_exists($name, $this->_attributes)) {
            return $this->_attributes[$name];
        } elseif ($this->hasAttribute($name)) {
            return null;
        } else {
            if (isset($this->_related[$name]) || array_key_exists($name, $this->_related)) {
                return $this->_related[$name];
            }
            $value = parent::__get($name);
            if ($value instanceof ActiveQueryInterface) {
                return $this->_related[$name] = $value->findFor($name, $this);
            } else {
                return $value;
            }
        }
    }

И попробуйте в нём встроить для отладки: var_dump($this->_attributes, $this->_related); die(); — это прояснит ситуацию.

Источник

Вам также может быть интересно:

Drag and Drop UWP — c# xaml mvvm
Вопрос: Нужно иметь возможность добавлять изображения в приложение путем перетаскивания из файловой системы У Grid включил AllowDrop. Но как добавить перетаскиваемые изображения в коллекцию? Т.к. те ...
Растягивание Высоты , Резина — html css html5
Вопрос: Здравствуйте! Реализовал резиновый дизайн. Растягивается ширина, но длина по % не растягивается. Возможно ли это реализовать? Или так и задумано, растягивание только на ширину ...
Jquery position().left Как быть на мобильниках? — javascript jquery css
Вопрос: На мобильных устройствах, если зумишь экран, position всегда разный. $('g').position().left Как сделать так, чтобы он не менял свои значения? Автор вопроса: ...
Jquery position().left Как быть на мобильниках? — javascript jquery css
Вопрос: На мобильных устройствах, если зумишь экран, position всегда разный. $('g').position().left Как сделать так, чтобы он не менял свои значения? Автор вопроса: ...
requestAnimation и очередность отрисовки — javascript canvas
Вопрос: Здравствуйте! Реализовал 2D игру и в Edge работает все плавно и круто, но в Firefox'e подвисает, сказали, что нужно сделать, чтобы раз-два момент и все ...
Контекстное/всплывающее меню в Android — java android popup
Вопрос: Есть ли техническая возможность сделать приложение, добавляющее свое контекстное или всплывающее меню в любом месте системы? Хочу, чтобы при выделении любого текста появлялась дополнительная кнопка ...
Контекстное/всплывающее меню в Android — java android popup
Вопрос: Есть ли техническая возможность сделать приложение, добавляющее свое контекстное или всплывающее меню в любом месте системы? Хочу, чтобы при выделении любого текста появлялась дополнительная кнопка ...
Завершить службы циклом — c# windows-service
Вопрос: Можно ли остановить службы циклом? У меня есть список служб, занёс их в List List<string> name = new List<string> { "AdobeARMservice", "RemoteRegistry", "TermService", "Messenger", "SSDPSRV", ...
Завершить службы циклом — c# windows-service
Вопрос: Можно ли остановить службы циклом? У меня есть список служб, занёс их в List List<string> name = new List<string> { "AdobeARMservice", "RemoteRegistry", "TermService", "Messenger", "SSDPSRV", ...
RecyclerView — разная разметка — android recyclerview
Вопрос: Смотрел, я смотрел в сторону RecyclerView и наконец решил кинуть ListView и на тебе! В "плохом прошлом" мой ListView использовался для двух разметок. Сейчас я ...
RecyclerView — разная разметка — android recyclerview
Вопрос: Смотрел, я смотрел в сторону RecyclerView и наконец решил кинуть ListView и на тебе! В "плохом прошлом" мой ListView использовался для двух разметок. Сейчас я ...
Как правильно передать массив аргументом для пользовательской функции — php
Вопрос: Если не брать в функцию все это, тогда результат работает. А если вот так в функции все выполнять, тогда PHP ругается: «Invalid ...
Как правильно передать массив аргументом для пользовательской функции — php
Вопрос: Если не брать в функцию все это, тогда результат работает. А если вот так в функции все выполнять, тогда PHP ругается: «Invalid ...
ViewPager внутри ViewPager — такие матрешки работают? — android viewpager
Вопрос: Доброго времени суток. Назрела новая задача. Есть каталог мастеров. При выборе конкретного мастера открывается его страница (активити с ViewPager), и теперь мастеров можно перелистывать свайпом. ...
Механизм добавления новых настроек в админке wp и корректный рендеринг — php wordpress
Вопрос: Есть следующий код: $tabs = array( 'vk', 'facebook', 'instagram' ); $saved = false; if(isset($_POST) && $_POST == 'Y') { $plugin_source_tabs = $_POST; update_option('plugin_source_tabs', ...