1

如何在sfDoctrineGuardPlugin處理的登錄過程中設置用戶文化?每個用戶可以設置其存儲在sfGuardUserProfile表中的首選語言。使用sfDoctrineGuardPlugin在登錄時設置用戶文化

本來我曾想過做類似這種重寫executeSignin()功能:

public function executeSignin(sfWebRequest $request) 
{ 
    $this->getUser()->setCulture($this->getUser()->getGuardUser()->getProfile()->getLanguage()); 
    parent::executeSignin($request); 
} 

但很明顯,我不能這樣做,因爲我沒有父功能之前訪問GuardUser對象被執行。

然後我想到了創建一個類似的postExectute()功能:

public function postExecute() 
{ 
    if($this->getUser()->isAuthenticated()){ 
    //SET USER CULTURE 
    } 
} 

,但這又不能工作,因爲登入功能做了重定向,以便postExecute()將永遠不會運行。

我不能把我的邏輯在登錄後在默認頁面上設置文化,因爲用戶並不總是被重定向到同一頁面甚至是同一個模塊。

回答

2

我會繼續比重新創建操作更容易。

在您的文件/apps/[your app]/lib/user/myUser.class.php延伸sfGuardSecurityUser

您可以覆蓋signIn功能類似:

public function signIn($user, $remember = false, $con = null) 
{ 
    parent::signin($user, $remember, $con); 

    $this->setCulture($user->getProfile()->getLanguage()); 
} 

所以每一個用戶的時間登錄,就會有它的文化設置好的。

+0

這也不錯。我習慣於重寫這個動作,因爲我通常會在成功登錄後重新執行重定向操作。 – 2013-02-27 09:51:54

+0

@MichalTrojanowski它總是取決於你需要做多少工作*圍繞* signIn方法:) – j0k 2013-02-27 09:56:37

+0

謝謝!這正是我所期待的。另外作爲獎勵,我沒有意識到我可以省略getGuardUser()並直接調用getProfile()。這很棒。 – Zach 2013-02-27 16:03:59

0

在認證之前,您無權訪問sfGuardUser對象。這並不意味着您無法從action實例訪問sfUser,而這正是您所需要的。

是否行

$this->getUser()->isAuthenticated() 

不建議你,當你把它叫做一個用戶不一定認證。

所以,如果該行不設置的文化,看看別的地方。我將開始檢查文化是否存在於某種形式的請求中,可能會覆蓋您的上一行,因此請嘗試更換這些文件。

在Symfony中,sfUser表示一個PHP會話,它在用戶登錄之前啓動,而不是用戶。您嘗試通過sfUser :: setAttribute處理會話數據,以便能夠正常工作。

+0

我意識到我有權訪問sfUser來設置文化,但是我不知道要將其設置爲什麼文化,直到我有權訪問sfGuardUser對象,因爲用戶將其語言首選項存儲在sfGuardUserProfile表中。至於'isAuthenticated()'調用......這個'postExecute()'函數在sfGuardAuth模塊中,它也處理註銷,所以我需要檢查並確保用戶在我嘗試訪問sfGuardUser對象或我之前進行身份驗證會得到錯誤。 – Zach 2013-02-26 23:46:07

+0

那麼爲什麼你不包裝試圖將第一個片段中的文化設置爲第二個片段中的條件?我的意思是不是在postExecute,但在原地(在第一個片段)。 – marekful 2013-02-26 23:50:57

1

你的第一個猜測是正確的做法,只是需要改變;)

,而不是調用父executeSignin()編寫自己的登入動作(例如複製的插件使用的)。然後添加你需要的行

$this->getUser()->setCulture($this->getUser()->getGuardUser()->getProfile()->getLanguage()); 

就在重定向之前 - 所以當你已經有配置文件分配給你的用戶會話。

您可以settings.yml更改設置有sfDoctrineGuard使用新的動作:

all: 
    .settings: 
    login_module:   myCleverModule 
    login_action:   signinMyUser 

你也可以在你的app/appName/modules/sfGuardAuth/actions創建文件夾,創建一個actions.class.php那裏,把你的executeSignin()功能在這個文件中。它會自動覆蓋插件中的原件。

+0

謝謝你的回答。我已經接受j0k的答案,因爲它對我目前的需求來說更加優雅。如果將來我需要添加更多邏輯或調整默認功能,那麼您的解決方案肯定會成爲您的選擇。 – Zach 2013-02-27 16:07:43

相關問題