在我的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?
答案 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 */};