2

在我的 zf2 项目中,我有学说 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?

4

1 回答 1

1

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

然后您可以将您的身份设置Namespace\For\Entity\User为您的 AuthenticationService 身份并通过 setter 注入来注入身份验证服务(请参阅这篇关于挂钩到 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 */};
于 2013-10-19T23:15:11.083 回答