2015-06-20 4 views
0

Мне интересно, что обычно рекомендуется для обработки guests в Yii2.Обработка гостей в Yii2 для предотвращения постоянных проверок

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

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

Тогда вы можете делать такие вещи, как ниже, в зависимости от того, каких подробностей вы доступны для них:

$user->username; 
$user->email; 

Однако, очевидно, когда мы имеем guestYii::$app->user->identity возвращается null.

В моей ситуации я постоянно нужно проверить, если пользователь является гостем или зарегистрированного пользователя, и, следовательно, придется повторить подобный код в различных местах:

if (Yii::$app->user->isGuest) { 
    $username = Yii::t('general', 'Guest'); 
} else { 
    $username = Yii::$app->user->identity->username; 
} 

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

Я не уверен, что в настоящее время любой рекомендуемый способ сделать это в Yii2, но я думал, что, возможно, что-то вроде расширения yii\web\User класса и делать что-то вроде ниже:

public function getIdentity() { 

    $identity = parent::getIdentity(); 

    if (empty($identity)) { 
     $identity = new stdClass(); 
     $identity->username = Yii::t('general', 'Guest'); 
    } 

    return $identity; 

} 

является то, что целесообразной образом для достижения того, чего я хочу, или есть лучший способ?

ответ

3

Расширение пользователя - хорошая идея, но лучше добавить туда новый метод, например getUsername() или getAttributes(), возвращающий данные по умолчанию для удостоверения личности/гостя. Ваш способ уничтожит метод 'getIsGuest' пользователя, который основан на 'getIdentity' null/not null return. И я считаю, что этот метод очень важен, и изменение его ответа может сломать много других вещей в вашем приложении.

ОБНОВЛЕНИЕ. Вы можете установить расширенный класс пользователя в config-> components-> user-> class:

[ 
    'components' => [ 
     'user' => [ 
      'class' => 'my\namespace\User' 
     ] 
    ] 
] 
+0

Hi Pavel. Спасибо за ответ. Хорошая идея о создании другого метода; однако я бы не нарушил метод getIsGuest, если бы я не продлил это, а? Как это называется, он будет вызываться из родителя, который будет использовать метод getIdentity для родителей, а не тот, который содержится в расширенном классе? – Brett

+1

Привет Бретт. Изменение общего возврата метода не является лучшей практикой. Вам уже нужно найти все методы, которые используют «getIdentity()» и проверить, зависят ли они от его нулевого результата. Затем вы должны быть уверены, что никто другой никогда не будет использовать свой нулевой результат (например, если вы добавите новое расширение или новый разработчик). –

+0

Да, верно, как вы предложили, это лучшее решение наверняка. Не знаете ли вы, как заставить Yii указывать на мой расширенный класс, а не на 'yii \ web \ User'? – Brett