【问题标题】:Managed entity doesn't show as managed托管实体未显示为托管
【发布时间】:2014-08-19 14:44:23
【问题描述】:

我遇到的问题是,在捆绑包中,我将用户设置在令牌上以传递给安全上下文。这对我进行了身份验证,并且工作正常。但是,每当我通过这样做从另一个包中的安全上下文中检索该用户时:

$this->getUser()

我得到了正确的实体,所有数据都在那里,但是 Doctrine 说它不是托管实体。

在令牌上设置用户的代码如下:

    protected function logUserIn($userId, $name, $locale, $roles, $permissions)
    {
        $csbAuthUser = new User($name, $userId, $roles, $locale, $permissions);
        $token = new UsernamePasswordToken(
            $csbAuthUser,
            null,
            'csb',
            $roles
        );

        if ($this->csbAuthEntityString) {
            $user = $this->entityManager->getRepository($this->csbAuthEntityString)-    >findOneBy(array(
                'connectSBUser' => $userId,
            )
        );

        $user->setUsername($name);
        $user->setRoles($roles);
        $user->setLocale($locale);
        $user->setPermissions($permissions);

        $token = new UsernamePasswordToken(
            $user,
            null,
            'csb',
            $roles
        );
    }
    $this->securityContext->setToken($token);

这是一个问题,因为每次我想更新与用户实体有联系的任何内容时,Doctrine 都会说它在关系中找到了一个新实体。

【问题讨论】:

    标签: symfony doctrine-orm


    【解决方案1】:

    无论哪种方式,您都会获得User 的实例 - 但您在方法顶部创建的默认用户不是托管对象。从您的实体管理器返回的实体将是。

    $this->csbAuthEntityString 的值是多少,您确定它会出现在 IF 语句中吗?我会用一些调试输出仔细检查。

    【讨论】:

    • 我检查了很多次,它进入了 IF 语句。 $this->csbAuthEntityString 是一个参数,它设置为我想要的类的值。这是有效的,我已经检查了很多次。我通过执行$this->securityContext->getToken()->getUser() 从令牌获取用户来检查用户实体是否在设置令牌时受到管理,并且 Doctrine 返回它确实是受管理的。我正在使用两个不同的捆绑包。可能是因为我在另一个包中编辑实体,而在另一个包中没有正确设置?
    • 如果您从令牌/会话中获取用户,您很可能需要将merge 实体返回到实体管理器。检查this资源
    猜你喜欢
    • 2021-09-21
    • 1970-01-01
    • 2011-11-18
    • 2023-03-14
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    相关资源
    最近更新 更多