2016-08-24 81 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 %}