Doctrine是与Symfony结合的野兽,但我似乎找不到如何实现我需要的好例子。
我的用户架构非常标准。我想设置一个one-to-one association,指向用户拥有的论坛权限。
为了使其正常工作,我需要创建一个“默认实体”,其中包含创建时为用户提供的默认权限。
这是User#forumPermission association
/**
* @var $forumPermissions ?ForumPermission
* One User instance has One Forum Permission instance.
* @ORM\OneToOne(targetEntity="ForumPermission")
* @JoinColumn(name="forum_permission_id", referencedColumnName="id")
*/
private $forumPermission;
/**
* @return ForumPermission
*/
public function getForumPermission() : ?ForumPermission
{
return $this->forumPermission;
}
/**
* @param ForumPermission $forumPermission
*/
public function setForumPermission(ForumPermission $forumPermission): void
{
$this->forumPermission = $forumPermission;
}
这意味着此时forum_permission表为空。
在那之后,我在学说文档中读到你可以听到与潮红和坚持有关的各种事件。以下是onFlush
这就是我想出来的
public function onFlush(OnFlushEventArgs $eventArgs)
{
$em = $eventArgs->getEntityManager();
$uow = $em->getUnitOfWork();
foreach ($uow->getScheduledEntityInsertions() as $entity) {
/* @var $entity User */
if (true === $entity instanceof User
&& null === $entity->getForumPermission()) {
$entity->setForumPermission($this->getDefaultForumPermission($em, $uow));
}
}
}
private function getDefaultForumPermission(
\Doctrine\ORM\EntityManagerInterface $em,
\Doctrine\ORM\UnitOfWork $uow)
{
// Get the default permissions form the database
$defaultForumPermission = $em->getRepository(ForumPermission::class)->find(1);
// I will create a new entity if the default permissions do not exist
if (null === $defaultForumPermission) {
$defaultForumPermission = new ForumPermission();
$uow->persist($defaultForumPermission);
$uow->computeChangeSet($em->getClassMetadata('\App\Entity\ForumPermission'), $defaultForumPermission);
}
return $defaultForumPermission;
}
文档不清楚你可以做什么以及你应该在哪里做。 我想我可以在控制器中完成所有这些操作,但我喜欢按设计的意图保留它所属的所有内容。
所以我想知道这是否是最佳方式,我应该在prePersist或其他活动期间这样做吗?非常感谢任何帮助。
答案 0 :(得分:0)
如果我说得对,那么每次创建User
时,您都希望创建与此ForumPermission
相关联的新User
。最好的方法是收听prePersist
Doctrine事件。
有关其他信息,请参阅https://symfony.com/doc/current/doctrine/event_listeners_subscribers.html。