【问题标题】:Should I repack the fetched entity object before passing it to the twig template?在将获取的实体对象传递给树枝模板之前,我应该重新打包它吗?
【发布时间】:2018-03-18 20:16:22
【问题描述】:

我正在使用 Symfony 4。我有一个获取的对象 $user 与其他实体有关系。我已经设置了所有的 getter,所以我可以从 $user 对象中获取其他信息。

$user = $em->getDoctrine()->getRepository(User::class)->find($id);

$usergroup = $user->getGroup()->getName();

我要做的是创建一个新对象,以便在将 $user 对象传递给模板之前重新打包我需要的信息。

# controller
$repack_user = new \stdClass();
$repack_user->id = $user->getId();

$user_friends = $user->getFrends();

$friends_gf = [];

foreach($user_friends as $friend) {
    $friends_gf[] = $friend->getGirlfriend()->getName();
}

$repack_user->friends_gf = $friends_gf;

return $this->render("home.html.twig", ['user' => $repack_user]);

然后在模板中,我用类似的程序解压。

# twig template
{{ user.id }}

{% for gf in user.friends_gf %}
    {{ gf }}
{% endfor %}

但由于我也可以在 twig 中调用实体函数,所以我可以跳过控制器中的所有重新打包并将 $user 对象直接传递到模板中。

# skipped repack in controller
# twig template
{{ user.getID() }}

{% for friend in user.getfriends %}
    {{ friend.getGirlfriend().getName() }}
{% endfor %}

第一种方法有点多余,因为我必须做两次。第二种方式有点难读。那么哪种方法更合理呢?这样做的常见做法是什么?

【问题讨论】:

    标签: symfony twig entityobject


    【解决方案1】:

    常见的做法肯定是把你的实体图直接交给视图。

    为什么你认为你的第二个例子更难阅读?

    如果您不希望模板中出现这些链接调用,您可能需要考虑在您的用户实体中添加另一个 getter。比如:

    public function getNamesOfFriendsGirlfriends() 
    {
      $gfNames = [];
      foreach($this->getFriends() as $friend) {
        $gfNames[] = $friend->getGirlfriend()->getName();
      }
      return $gfNames;
    }
    

    然后在你的模板中调用它:

    {% for gfName in user.namesOfFriendsGirlfriends %}
        {{ gfName }}
    {% endfor %}
    

    如果您需要许多这些帮助器并且不想破坏您漂亮而干净的实体,您可能需要考虑将它们包装在 Decorator 对象中,然后在视图层中使用它。

    【讨论】:

    • 谢谢。那我就按照惯例去吧。而且我刚刚意识到我不需要“get”前缀和括号调用来获取 twig 中的值,这样就不那么混乱了。
    猜你喜欢
    • 2018-01-29
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 2016-02-20
    • 2019-02-05
    相关资源
    最近更新 更多