2016-08-24 83 views
2

道歉,如果这已被问到。我做了一些搜索,没有找到一个简单的解决方案。来自Twig参数的呼叫功能

我有一个symfony/doctrine项目。考虑到业务逻辑不应放置在视图中,从小枝调用函数的适当方式是什么。

我有一个对象数组,我想检查登录用户是否是帖子中每个对象的所有者。

例如是这个合适

//in twig template 
    {% for post in posts %} 
     {% if post.isOwner(user_id) %} 
      //do stuff 
     {% endif %} 
    {% endfor %} 

,并在后的实体有这个

//in entity  
    public function isOwner(user_id){ 
     if (post.getId() == user_id) 
      return true; 
     return false 
    } 

如果这不是最好的做法,这可怎么适当地实现。

+0

在我看来,将逻辑放入实体(适合实体)是非常好的做法。如果你仍然有一些逻辑不适合你的实体,并且你必须在Twig中创建Twig,那么你应该创建Twig扩展。但是,只有当这个逻辑属于视图层时,它才是一个好的解决方案http://symfony.com/doc/current/templating/twig_extension.html –

回答

1

不知道什么你就像试图这样做,但如果你通过一个特定用户的帖子要循环,你宁愿建立一个双向directionnal关系和使用

{% for post in app.user.posts %} 

在另一方面,如果你想通过所有的帖子环和做的authed用户拥有的帖子一些自定义的逻辑上的帖子循环,你是好去与你的原代码。我想改变一些东西,但:

语义/可读性的原因,我会改变

//in twig template 
{% for post in posts %} 
    {% if post.isOwner(user_id) %} 
     //do stuff 
    {% endif %} 
{% endfor %} 

//in twig template 
{% for post in posts %} 
    {% if app.user.isOwner(post) %} 
     //do stuff 
    {% endif %} 
{% endfor %} 

{% for post in posts %} 
    {% if post.isOwnedBy(app.user) %} 
     //do stuff 
    {% endif %} 
{% endfor %} 

而且我会改正的逻辑方法:

//in entity AcmeBundle\User  
public function isOwner(AcmeBundle\Post $post){ 
    if ($this == $post->getUser()) { 
     return true; 
    } 

    return false; 
} 
+0

非常感谢......这就是我正在尝试做的。感谢您的更正 –

+0

您是循环浏览特定用户的帖子,还是循环浏览整篇文章并为authed用户做一些自定义逻辑? – VaN

+0

我正在循环访问一系列帖子。帖子从控制器传递。你的回答正是我期待做的。我不确定是否将从树枝传递给实体的最佳做法 –

0

似乎好的做法是的。由于逻辑只分布在一条线上,我想说这是一条路。
只有雷马克的是,你可以重写这段代码:

{% for post in posts if post.isOwner(user_id)%} 
    .... 
{% endfor %}