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 или другого события? Любая помощь с благодарностью.