Получить профиль пользователя - dektrium/yii2-user Yii2

Я использовал dektrium/yii2-user в своем приложении. И есть метод с именем getID() в User.php в vendor/dektrium, и этот метод может быть доступен Yii::$app->user->getID() и возвращает id вошедшего в систему пользователя.

Однако есть еще один метод с именем getProfile(), функция которого состоит в том, чтобы вернуть полную информацию о профиле вошедшего в систему пользователя. Но этот метод дает 500-внутреннюю ошибку сервера.

exception 'yii\base\UnknownMethodException' with message 'Calling unknown method: yii\web\User::getProfile()' in ... ...

Я погуглил проблему, но ничего не нашел... Помогите мне, люди..


person Choxx    schedule 10.02.2016    source источник


Ответы (3)


Я считаю, что вы можете получить профиль текущего пользователя, вошедшего в систему, следующим образом:

Yii::$app->user->identity->profile;

потому что Yii::$app->user->identity возвращает текущего пользователя - объект User.

Вы путаете объект веб-пользователя Yii с пользовательской моделью :)

РЕДАКТИРОВАТЬ:

Yii::$app->user относится к yii\web\User — компоненту приложения, который управляет статусом аутентификации пользователя.

Вы просите этот пользовательский компонент получить «идентификацию», которая:

IdentityInterface — это интерфейс, который должен быть реализован классом, предоставляющим идентификационную информацию.

В этом случае модель пользователя Dektrium реализует IdentityInterface, и вы можете вызвать на ней getId и получить идентификатор для модели пользователя.

class User extends ActiveRecord implements IdentityInterface

Этот код:

Yii::$app->user->identity->profile;

Вернет данные модели Profile, связанные с User

И вы можете получить доступ к его полям напрямую:

Yii::$app->user->identity->profile->location;

Подробнее см. dektrium\user\models\Profile.


Люди всегда путаются в yii\web\User, IdentityInterface и модели User.

person jacmoe    schedule 11.02.2016
comment
Эй Эй Эй! Я не могу понять, какие данные выводятся с помощью Yii::$app->user->identity->profile;. Однако я понял, что проблема с моим кодом заключается в следующем: я пытаюсь получить доступ к методу, представленному в User.php dektrium, и по умолчанию код Yii::$app->user->getProfile; ищет метод в yii\web\User не в dektrium/../Пользователь - person Choxx; 12.02.2016
comment
Обновленный пост, чтобы объяснить, как получить данные профиля - person jacmoe; 12.02.2016

Если у вас есть экземпляр пользователя ($user), вы можете использовать функцию getProfile():

$profile = $user->getProfile()->one();

И он возвращает запись профиля от этого пользователя.

Если у вас нет экземпляра пользователя, но есть идентификатор ($user_id), вы можете напрямую получить экземпляр модели профиля:

$profile = Profile::find()->where(['user_id' => $user_id)->one();

И Yii::$app->user — это интерфейс к пользовательской модели, определенной в вашем приложении (в данном случае пользовательская модель dektrium): http://www.yiiframework.com/doc-2.0/yii-web-user.html

подводить итоги:

$user_id = Yii::$app->user->getID();
$profile = Profile::find()->where(['user_id' => $user_id)->one();
person stig-js    schedule 12.02.2016
comment
Нет, Yii::$app->user не является интерфейсом для пользовательской модели, но он может получить текущего пользователя, вошедшего в систему, с помощью identity - person jacmoe; 12.02.2016
comment
public function getId() { $identity = $this-›getIdentity(); вернуть $identity !== null ? $identity-›getId() : null; } - person jacmoe; 12.02.2016
comment
@stig-js описанный вами подход неэффективен. Вместо этого в настоящее время я использую $profile = Profile::findOne(Yii::$app->user->getID());, который, я думаю, лучше, чем вы дали... - person Choxx; 12.02.2016
comment
@choxx findOne использует внутреннее условие findbycondition, которое также вызывает метод find: yiiframework.com/doc-2.0/ github.com/yiisoft/yii2/blob/master/framework/db/ - person stig-js; 12.02.2016
comment
@jacmoe вы правы, как сказано в ссылке, которую я разместил, Yii::$app-›user — это класс для компонента пользовательского приложения, который управляет статусом аутентификации пользователя. Итак, в конфигурации вы определили класс пользователя как dektrium one, но я слишком упростил. - person stig-js; 12.02.2016
comment
@stig-js неудивительно, что людям трудно все это понять :) Я просто хотел указать, что Пользователь и Пользователь - это не одно и то же, и что между ними существует IdentityInterface. ;) - person jacmoe; 12.02.2016
comment
@stig-js да, это правда ... Я согласен, поскольку вы опубликовали доказательство :-p Но вместо того, чтобы писать длинную строку, я бы предпочел написать короткий код. Мне лень. Это моя проблема... ;) - person Choxx; 15.02.2016
comment
@choxx не волнуйся ;) - person stig-js; 15.02.2016

Попробуй это

\app\models\User::findOne(Yii::$app->user->identity->id)->profile;
person makDee    schedule 11.02.2016
comment
Было бы лучше объяснить, почему это сработает, чтобы он понял, почему его формула не работает. - person phaberest; 11.02.2016