2016-02-10 5 views
3

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

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

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

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

ответ

6

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

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

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

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

EDIT:

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 и модели пользователя. Myself включены: р

+0

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

+0

Обновлено сообщение, чтобы объяснить, как получить данные профиля – jacmoe

0

Попробуйте один

\app\models\User::findOne(Yii::$app->user->identity->id)->profile; 
+1

Было бы лучше объяснить, почему это сработает, чтобы он понял, почему его формулы нет. – phaberest

+0

Это не будет работать для моего случая, так как я использую расширенный улучшенный шаблон. – Choxx

1

Если у вас есть экземпляр пользователя ($ пользователя), вы можете использовать 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(); 
+0

Нет, 'Yii :: $ app-> пользователь не является интерфейсом к пользовательской модели, но он может получить зарегистрированного пользователя используя 'identity' – jacmoe

+0

public function getId() { $ identity = $ this-> getIdentity(); return $ identity! == null? $ identity-> getId(): null; } – jacmoe

+0

@ stig-js описанный вами подход неэффективен. Вместо этого в настоящее время я использую '$ profile = Profile :: findOne (Yii :: $ app-> user-> getID());' который я думаю лучше, чем вы дали ... – Choxx

Смежные вопросы