由zf2项目中的doctrine实体中的PrePersist上的用户引用创建的集合

时间:2013-10-19 04:15:42

标签: doctrine-orm zend-framework2 zfcuser

在我的zf2项目中,我有doctrine 2实体引用由以下创建的用户实体:

/**
 * @ORM\ManyToOne(targetEntity="User")
 * @ORM\JoinColumn(name="created_by", referencedColumnName="id")
 **/
protected $createdBy;

我希望在PrePersist中设置此引用,我该怎么做? 我尝试了以下(我不知道它是否正确):

/** @ORM\PrePersist */
public function prePersist() {
    if ($this->createdBy === null) {
        $session = new \Zend\Authentication\Storage\Session;
        $userId = $session->read();
        if ($userId !== null) {
            $this->createdBy = $userId;
        } else {
            throw new \Exception("Invalid User");
        }
    }
}

但主要问题是$userId是一个整数,createdBy必须保留用户的引用而不是用户ID。

有更好的方法吗?如果不是,我怎样才能获得引用而不是用户ID?

1 个答案:

答案 0 :(得分:1)

您可以配置Zend\Authentication\AuthenticationService来处理经过身份验证的身份,而不是直接访问会话存储。

然后,您可以将Namespace\For\Entity\User设置为您的AuthenticationService标识,并通过setter注入注入身份验证服务(请参阅this post关于挂钩到Doctrine生命周期事件)。

然后你应该能够做到这一点:

/** @ORM\PrePersist */
public function prePersist() {
    if (empty($this->createdBy)) {
        $this->setCreatedBy($this->getAuthenticationService()->getIdentity());
    }
}

...或者您可以向您的实体添加$ loggedInUser属性,并直接注入登录用户,而不是创建对AuthenticationService(或会话存储)的依赖。这可能是更好的方法,因为它简化了测试:

/** @ORM\PrePersist */
public function prePersist() {
    if (empty($this->createdBy)) {
        $this->setCreatedBy($this->getLoggedInUser());
    }
}

请注意,我通过使用setter删除了prePersist方法中的类型检查,因为这样你就可以通过setter提示来处理它,如下所示:

public function setAuthenticationService(\Zend\Authentication\AuthenticationService $authenticationService){/** do stuff */};

public function setLoggedInUser(\Namespace\For\Entity\User $user){/** do stuff */};

public function setCreatedBy(\Namespace\For\Entity\User $user){/** do stuff */};