2015-06-20 44 views
0

我想知道什麼是Yii2中處理guests的推薦方式。在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()返回身份/訪客默認數據。 您的方式將銷燬基於'getIdentity'null/not null return的用戶'getIsGuest'方法。我相信這種方法是必不可少的,改變它的響應可能會在你的應用中破壞很多其他的東西。

UPDATE。 您可以在config-> components-> user-> class中設置您的擴展用戶類:

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

Hi Pavel。感謝你的回答。關於創建不同方法的好主意;但是我不會打破'getIsGuest'方法,除非我擴展了這個方法。當它被調用時,它會從父級調用,而父級將使用父級getIdentity方法而不是擴展類中的方法? – Brett

+1

嗨佈雷特。改變常用的方法返回並不是最佳實踐。你必須找到所有使用'getIdentity()'的方法,並檢查它們是否依賴於它的空結果。接下來,您必須確保沒有其他人會使用其空結果(例如,如果您添加新的擴展程序或新開發人員)。 –

+0

是的,您建議的方式當然是更好的解決方案。你會不會知道如何讓Yii指向我的擴展類而不是'yii \ web \ User'? – Brett