1

想象一下这个场景:

  • 有用户和组。还有一个 Membership 实体来映射 ManyToMany 关系
  • 用户可以创建、加入、离开和向他们所属的组发送评论。

应用程序中有几个“主要”模板:

  • 上次更新的群组
  • 登录用户所属的组
  • 其他组列表页面,例如搜索结果

还有一个“迷你组”模板,显示#members、#comments 等信息,如果当前登录用户是成员、有评论或创建了组,则标记

主要模板是循环构建的,包括迷你组模板。

minigroup 模板需要知道用户是否是成员,是否有评论等...

你将如何管理这个逻辑?

  • 获取控制器中涉及组列表的每个操作的所有数据
  • 一个实体方法,它返回一个用户是成员的 id 数组,或者有评论等。
  • 登录时将此数组存储在会话中,并在用户评论、加入、离开时更新它...

您将如何让 minigroup 模板了解这些案例。

  • 每个 minigroup 都可以从 include 语句中接收一些布尔值“isMember”“hasComments”
  • 每个迷你组可以接收用户所属的组列表、评论列表等。然后检查当前组 ID 是否在该列表中

现在我已经实现了实体方法和布尔标志,但我不确定是否有更惯用或更有效的方式来实现它。

{% set userGroups = app.user ? app.user.participatedGroupIds : {} %}
{% set userComments = app.user ? app.user.commentedGroupIds : {} %}
{% for group in groups %}
  {% set vars = {'isMember':group.id in userGroups, 'hasComments':group.id in userComments} %}
  {% include 'GroupBundle:Default:minigroup.html.twig' with vars %}
{% endfor %}

您将如何处理这种情况?

你知道更好的播种方法吗?

谢谢!

4

1 回答 1

1

For my part, your example puts too much business logic into the view. "Is a user in this group" is valid as a templating question, but not valid for the template itself to solve.

So, for my part, I'd put a query method on your User entity, and leverage that in the view.

/* ... User Entity Class ... */

/**
 * Does the User participate in the provided Group?
 *
 * @param Group $group The Group entity to check for participation
 * @return boolean
 */  
public function participatesInGroup( Group $group )
{
  return in_array( $group->getId(), $this->participatedGroupIds() );
}

Then in your template you could either do

{% for group in groups %}
  {% set vars = {'isMember': app.user.participatesInGroup(group)} %}
  {% include 'GroupBundle:Default:minigroup.html.twig' with vars %}
{% endfor %}

Or skip the set line altogether and let the template logic in minigroup.html.twig make the query on its own.

于 2013-10-15T16:21:29.163 回答