设置一对一关联的默认值

时间:2018-05-17 09:42:50

标签: symfony doctrine-orm orm

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或其他活动期间这样做吗?非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

如果我说得对,那么每次创建User时,您都希望创建与此ForumPermission相关联的新User。最好的方法是收听prePersist Doctrine事件。

有关其他信息,请参阅https://symfony.com/doc/current/doctrine/event_listeners_subscribers.html