Установка значения по умолчанию для связи один на один - PullRequest
0 голосов
/ 17 мая 2018

Doctrine - это зверь в сочетании с Symfony, но я не могу найти хороших примеров того, как достичь того, что мне нужно.

Моя пользовательская схема довольно стандартная. Я хочу установить однозначное сопоставление , которое указывает на разрешение форума, которое есть у пользователя.

Чтобы это работало, мне нужно создать «сущность по умолчанию», которая содержит права по умолчанию, предоставленные пользователю при создании.

Вот пользователь # 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 голосов
/ 19 мая 2018

Если я правильно понял, каждый раз, когда создается User, вы хотите создать новый ForumPermission, связанный с этим User.Лучший способ сделать это - прослушать событие prePersist Doctrine.

См. https://symfony.com/doc/current/doctrine/event_listeners_subscribers.html для получения дополнительной информации.

...