【问题标题】:Request group object with the user向用户请求组对象
【发布时间】:2017-08-27 16:17:23
【问题描述】:

我实际上正在学习 Symfony,并且我正在制作自己的 UserBundle,因为我必须使用在线 API 来管理用户。所以我加入了具有多对一关系的用户和组对象。目前一切正常。

Symfony 正在实现每个页面上的 User 对象并获取组的 id(参见 var_dump),但我希望 Symfony 获取每个页面上的整个 Group 对象,而不仅仅是它的 id。

User {#467 ▼
  -id: 104
  -uuid: "~"
  -username: "~"
  -lastLogin: null
  -websiteActivity: null
  -clientToken: "1c667ad4-07e2-4ffa-8db1-9997eadbbc4b"
  -accessToken: "b183f850ce4d4decb07cb7485c1d0a88"
  -dataCheck: DateTime {#457 ▼
    +"date": "2017-08-27 18:23:31.000000"
    +"timezone_type": 3
    +"timezone": "Europe/Berlin"
  }
  -reputation: 0
  -group: Group {#456 ▼
    +__isInitialized__: false
    -id: 4
    -inheritId: null
    -name: null
    -chatColor: null
    -websiteName: null
    -websiteColor: null
     …2
  }
}

如果你知道怎么做,那真的很有帮助。

非常感谢。

【问题讨论】:

  • 不确定你在问什么 - 看起来 User 对象正在返回一个 Group 对象,正如你所期望的那样
  • 它不会返回整个对象,而只是返回 id 因为 Symfony 只在每个页面上获取用户。 Group 对象不应为空。
  • 注意它是如何没有被初始化的——那是因为你正在做一个用户对象的var_dump() 而没有任何加入到 Group 实体。我敢打赌,如果您执行var_dump($user->getGroup()->getName()),您将获得您期望的值,然后 Group 将被初始化,因为 Doctrine 将使用另一个查询加载该实体。本质上,您使用var_dump() 进行调试而不理解底层。另外,请改用dump();它是在 Symfony 2.6 中引入的,并且要好得多。
  • 我的意思是我可以在我所有的控制器上调用它,但它会非常重复,因为我几乎所有的页面都需要它。这就是为什么我正在寻找另一种方法来做到这一点。 (注:我正在使用转储)
  • 我需要看看你是怎么称呼它的。它是使用 ParamFetcher 自动抓取还是直接从 EntityManager 抓取?如果你展示你是如何做到的,我可以提供帮助。

标签: php symfony doctrine-orm symfony-3.3


【解决方案1】:

请记住,控制器上的 $this->getUser() 是以下内容的别名:

$this->container->get('security.token_storage')->getToken()->getUser();

你可以看看Using a Custom Query to Load the User。您可以使用它来自动加入您的 Group 实体:

public function loadUserByUsername($username)
{
    return $this->createQueryBuilder('u')
        ->select('u, g')
        ->leftJoin('u.group', 'g')
        ->where('u.username = :username OR u.email = :email')
        ->setParameter('username', $username)
        ->setParameter('email', $username)
        ->getQuery()
        ->getOneOrNullResult();
}

这在 Symfony 版本 previously documented,但为了清楚起见是 removed from the documentation,可能是因为大多数情况下不需要它。如果您愿意,也可以将其移至您的 UserRepository(如果存在)并从那里调用。

这将在用户登录时生效。试试看是否会自动检索您的 Group 对象。

【讨论】:

  • 正是我想要的!谢谢!
  • 是否可以通过此函数使用 id 而不是用户名加载用户?
  • 好吧,这个函数说loadUserByUsername(),通常在用户通过他们的电子邮件或用户名登录时发生,但是没有理由你不能也将ID传递给这个函数并更新您要搜索的查询->where('u.id = :id)->setParameter('id', $username);
  • 在逐行阅读简短文档并进行了很多尝试后它不起作用,我仍然只得到没有组的用户对象。它根本没有调用这个函数。
  • 如果你在调试,它只会在你初次登录时调用这个方法。你应该检查这个函数是否被调用;我认为这不会发生在每个请求上。确保首先发生这种情况。
猜你喜欢
  • 2019-05-19
  • 2017-04-30
  • 1970-01-01
  • 2010-12-26
  • 2020-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多