3

我在 Zend 框架中使用 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;     

    }
4

1 回答 1

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();

这将数据存储与实际的持久层分开。

如果您不喜欢将代码放在适当的位置并希望将其放在中心位置,请查看自定义存储库类的学说文档(他们知道实体管理器和“表格操作”)

于 2013-01-07T09:35:09.463 回答