2013-01-07 84 views
3

我在Zend框架中使用Doctrine 2。 我想要的是更新用戶密碼,而不需要用戶登錄。這是在實體類中執行此操作的正確方法嗎?Doctrine 2 - 在用戶未登錄的情況下更新用戶密碼

public function updatePassword($userId, $new_pass, $em){ 
    $em->getConnection()->getConfiguration()->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger()); 
    $qb = $em->createQueryBuilder(); 
    $q = $qb->update('\Application\User\Entity\User', 'u') 
      ->set('u.password', $qb->expr()->literal($new_pass)) 
      ->where('u.userId = ?1') 
      ->setParameter(1, "$userId") 
      ->getQuery(); 
    $p = $q->execute(); 
    return $p;  

    } 

回答

3

實體類不應該使用實體管理器。實體類只是一個數據存儲。

用戶實體類:

namespace Entity; 

class User { 
    // ... 

    public function setPassword($password) 
    { 
     $this->password = some_hash_algorythm($password); 
     return $this; 
    } 

    // ... 
} 

你的控制器或徘徊無論你想更新用戶的密碼:

$repo = $em->getRepository('Entity\User'); 
$user = $repo->find($userId); 
$user->setPassword($newPassword); 
$em->persist($user); 
$em->flush(); 

這個鴻溝,從實際的持久層數據存儲。

如果你不喜歡有代碼的地方,想擁有它在一箇中心位置看學說的文檔中自定義庫類(他們都知道實體管理器,並在那裏「錶行動」)

+0

非常感謝您的回覆:) – Coder

+0

我使用了以下內容: '$ repo = $ em-> getRepository('Application \ User \ Entity \ UserDetails'); $ user = $ repo-> findBy(array('userId'=> 12)); $ user-> setPassword('123'); $ em-> persist($ user); $ em-> flush(); ' 我能夠通過提取獲取$用戶詳細信息,但無法設置密碼。 錯誤顯示爲「調用非對象上的成員函數setPassword()」。我有在實體類中定義的set方法。有什麼我失蹤了嗎? – Coder

+0

如果找不到匹配的記錄,'find()'和'findBy()'將返回null/false。錯誤消息表明你得到一個空/假的值(至少沒有對象...這應該是唯一的情況,你沒有得到任何對象,據我所知)。 –

相關問題