Symfony 使用来自Twig的参数调用函数
如果已经有人问过,我会道歉。我做了一些搜索,但没有找到一个简单的解决方案 我有一个symfony/doctrine项目。如果业务逻辑不应该放在视图中,那么从twig调用函数的合适方式是什么 我有一个对象数组,我想检查登录的用户是否是帖子中每个对象的所有者 例如,这是否合适Symfony 使用来自Twig的参数调用函数,symfony,doctrine-orm,twig,Symfony,Doctrine Orm,Twig,如果已经有人问过,我会道歉。我做了一些搜索,但没有找到一个简单的解决方案 我有一个symfony/doctrine项目。如果业务逻辑不应该放在视图中,那么从twig调用函数的合适方式是什么 我有一个对象数组,我想检查登录的用户是否是帖子中每个对象的所有者 例如,这是否合适 //in twig template {% for post in posts %} {% if post.isOwner(user_id) %} //do stuff
//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
}
如果这不是最佳实践,如何适当地实现这一点 似乎是个不错的做法是的。由于逻辑只分布在一行上,我认为这是一种方法。
唯一的问题是您可以将此代码重写为:
{% for post in posts if post.isOwner(user_id)%}
....
{% endfor %}
不知道你想做什么,但是如果你想循环浏览一个特定的用户帖子,你宁愿建立一个双向关系并使用
{% for post in app.user.posts %}
另一方面,如果您想循环浏览所有帖子,并对授权用户拥有的帖子执行一些自定义逻辑,那么最好使用原始代码。但我会改变一些事情:
出于语义/可读性的原因,我会更改
//in twig template
{% for post in posts %}
{% if post.isOwner(user_id) %}
//do stuff
{% endif %}
{% endfor %}
到
或
我要纠正逻辑方法:
//in entity AcmeBundle\User
public function isOwner(AcmeBundle\Post $post){
if ($this == $post->getUser()) {
return true;
}
return false;
}
在我看来,将逻辑放入实体(适合实体)是非常好的实践。如果您仍然有一些不适合您的实体的逻辑,并且您必须在Twig中处理这些逻辑,那么您应该创建Twig扩展。但这是一个很好的解决方案,只有当这个逻辑属于视图层时,非常感谢。。。这就是我想做的。谢谢你的更正,你是在循环浏览一个特定用户的帖子,还是在整个帖子集合中循环浏览,并为授权用户做一些自定义逻辑?我在循环浏览一个帖子集合。从控制器传递POST。你的答案正是我想要做的。我不确定将参数从细枝传递到实体是否是最佳实践
{% 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;
}