SecurityContext用户不是由EntityManager管理的,“找到了一个新的实体”

时间:2014-04-27 22:28:38

标签: symfony doctrine-orm

我有一个允许用户加入用户组的ControllerAction。

通过Paramconverter获取UserGroup,用户始终是当前登录的用户。

/*
 * @ParamConverter("code", class="StregoUserBundle:UserGroup", options={"mapping": {"code": "code"}})
 * @param \Strego\UserBundle\Entity\UserGroup $code UserGroup Code
 */
public function joinGroupAction($code){
     $userManager = $this->get('strego_user.user_manager');
     $userManager->joinGroup($code, $this->getUser());
     return new Message('Erfolgreich der Gruppe beigetreten', 'success');
}

$ this-> getUser正在使用Symfony2 Base Controller,它基本上是从securityContext获取用户。

我的joinGroup如下所示:

public function joinGroup(UserGroup $userGroup, User $user){
    if (!$userGroup->getUsers()->contains($user)) {
        $userGroup->addUser($user);
        $this->em->merge($user);
        $this->em->persist($userGroup);
        $this->dispatcher->dispatch(
            UserEvents::USER_USERGROUP_JOIN,
            new UserGroupUserEvent($userGroup, $user)
        );
        $this->em->flush();
    }
}
  

正如你所看到的,我已经尝试合并用户,但我仍然得到了   以下错误消息:未捕获的PHP异常   Doctrine \ ORM \ ORMInvalidArgumentException:"找到了一个新实体   通过关系&#; Strego \ UserBundle \ Entity \ UserGroup#users'   没有配置为级联实体的持久化操作:mof。   解决此问题:显式调用EntityManager#persist()on   这个未知的实体或配置级联持久存在此关联   映射例如@ManyToOne(..,cascade = {" persist"})。"

我已经对这个问题进行了很多研究,但是所有可能的原因(不合并,很明显,使用多个em)都不适用于这种情况。

我的配置如下所示:

class UserGroup extends BaseGroup {
/**
 * @var Collection users
 * @ORM\ManyToMany(targetEntity="User", inversedBy="userGroups" )
 * @ORM\JoinTable(name="user_user_usergroup")
 * @Serialize\Expose()
 * @Serialize\MaxDepth(2)
 * @Serialize\Groups({"usergroup"})
 *
 */
protected $users;
}

class User extends BaseUser {
/**
 * @var Collection userGroups
 *
 * @ORM\ManyToMany(targetEntity="UserGroup", mappedBy="users")
 * @ORM\JoinTable(name="user_user_usergroup",
 *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")}
 * )
 */
private $userGroups;
}

更新 我试图改变持久性,因为" User"被定义为拥有方:

public function joinGroup(UserGroup $userGroup, User $user){
    if (!$userGroup->getUsers()->contains($user)) {
        $user->addUserGroup($userGroup);
        $this->em->persist($user);
        $this->dispatcher->dispatch(
            UserEvents::USER_USERGROUP_JOIN,
            new UserGroupUserEvent($userGroup, $user)
        );
        $this->em->flush();
    }
}

这导致再次插入用户,而不是插入关系。

1 个答案:

答案 0 :(得分:4)

根据我们在教义文档中所读到的内容,不清楚哪一方是拥有方:

  

对于ManyToMany双向关系,任何一方都可能是   拥有一方(定义@JoinTable的一方和/或没有   使用mappedBy属性,因此使用默认的连接表。)

在您的情况下,User表定义了连接表,但也声明了" mappedBy"属于自有方的属性,而不是所有者。

您确定用户始终是经过身份验证的用户,因此数据库中存在一个用户吗?

另一篇文章,在阅读后:http://docs.doctrine-project.org/en/2.1/cookbook/entities-in-session.html 就是这样:

  

一个常见的错误是不要从EntityManager #incun()的返回值中获取合并的用户对象。传递给merge的实体对象不一定是从方法返回的同一对象。

所以在第一个例子中:

    $this->em->merge($user);

应该成为

$user = $this->em->merge($user);