在将获取的实体对象传递给 twig 模板之前,我应该重新打包它吗?
Should I repack the fetched entity object before passing it to the twig template?
我正在使用 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 %}
第一种方法有点多余,因为我必须做两次。第二种方式有点难以阅读。那么哪种做法更合理呢?这方面的常见做法是什么?
通常的做法肯定是将实体图直接交给视图。
为什么您认为您的第二个示例更难阅读?
如果您不想在模板中使用这些链接调用,您可能需要考虑在您的用户实体中添加另一个 getter。类似于:
public function getNamesOfFriendsGirlfriends()
{
$gfNames = [];
foreach($this->getFriends() as $friend) {
$gfNames[] = $friend->getGirlfriend()->getName();
}
return $gfNames;
}
然后在您的模板中调用它:
{% for gfName in user.namesOfFriendsGirlfriends %}
{{ gfName }}
{% endfor %}
如果您需要很多这样的助手并且不想破坏您漂亮干净的实体,您可能需要考虑在视图层中使用它们之前将它们包装在 Decorator 对象中。
我正在使用 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 %}
第一种方法有点多余,因为我必须做两次。第二种方式有点难以阅读。那么哪种做法更合理呢?这方面的常见做法是什么?
通常的做法肯定是将实体图直接交给视图。
为什么您认为您的第二个示例更难阅读?
如果您不想在模板中使用这些链接调用,您可能需要考虑在您的用户实体中添加另一个 getter。类似于:
public function getNamesOfFriendsGirlfriends()
{
$gfNames = [];
foreach($this->getFriends() as $friend) {
$gfNames[] = $friend->getGirlfriend()->getName();
}
return $gfNames;
}
然后在您的模板中调用它:
{% for gfName in user.namesOfFriendsGirlfriends %}
{{ gfName }}
{% endfor %}
如果您需要很多这样的助手并且不想破坏您漂亮干净的实体,您可能需要考虑在视图层中使用它们之前将它们包装在 Decorator 对象中。