2016-01-20 85 views
0

我有一個Symfony應用程序,它具有通過表單操作的用戶模型,以允許用戶更改其用戶名。用戶模型驗證失敗,如何確保使用「舊」值

該模型由Doctrine ORM提供支持,並在用戶名字段上使用UniqueEntity驗證約束,因此如果他們嘗試將用戶名更改爲另一個現有用戶的用戶名,則會被拒絕。

這部分邏輯工作正常。

但是,我通過應用程序容器將「當前用戶」對象公開爲在Twig中像全局一樣使用,因此我可以在每個頁面的標題中顯示當前登錄用戶的用戶名。

但是,當使用配置文件表單並且用戶輸入無效的用戶名時,該值在實體對象中保持「設置」狀態,因此即使驗證拒絕成功並且不會保留錯誤的用戶名,頁面呈現錯誤的用戶名。

有沒有簡單的方法來克服這一點?我能想到的唯一明顯的事情就是創建第二個叫做「全局」的用戶名,它在表單處理之前複製傳入請求上的用戶名值,並在Twig模板中使用它 - 但似乎有點遺憾到「用戶」和「用戶名」。

回答

0

我不認爲你應該把你的用戶定義爲全局參數。相反,當前連接的用戶在你的嫩枝模板訪問只需使用:

{{ app.user }} 

此外,當你在你的枝杈稱之爲app.user變量,一個很好的做法是確保用戶已經通過身份驗證,以避免異常。這就是爲什麼你應該使用is_granted

{% if is_granted('IS_AUTHENTICATED_ANONMOUSLY') %} 
    No user, sorry! 
{% else %} 
    Logged in as {{ app.user.username }} 
{% endif %} 
+0

我的不好,我正在使用{{app.user}} - 在我的腦海中,我將其稱爲「全局」,儘管正如您指出的那樣,事實並非如此。 – andybee

0

您可以在呈現表單之前重新加載用戶實體。

$objectManager = $this->getDoctrine()->getManager(); 
$objectManager->refresh($user);