使用Twig中的参数调用函数

时间:2016-08-24 07:15:36

标签: symfony doctrine-orm twig

如果已经被问过,请道歉。我已经做了一些搜索而没有找到一个简单的解决方案。

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

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

例如,这是合适的

    //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
    }

如果这不是最佳实践,那么如何才能恰当地实现这一目标。

2 个答案:

答案 0 :(得分:3)

不知道你正在尝试做什么,但如果你想要浏览特定的用户帖子,你宁愿建立一个双向关系并使用

循环帖子
{% 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;
}

答案 1 :(得分:1)

似乎是良好做法。由于逻辑只分布在一条线上,我说这是要走的路。
只有转换才能重写此代码:

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