2013-01-20 41 views
1

在Symfony2.1項目中,如何在模板內部調用自定義實體函數?詳細說一下,請考慮以下情況;有兩個實體具有多對多關係:用戶和類別。在樹枝內使用存儲庫類方法

Doctrine2已經產生了這樣的方法:

$user->getCategories(); 
$category->getUsers(); 

因此,我可以在樹枝使用這些如:

{% for category in categories %} 
    <h2>{{ category.name }}</h2> 
    {% for user in category.users %} 
     {{ user.name }} 
    {% endfor %} 
{% endfor %} 

但我怎麼能得到用戶自定義函數?例如,我想列出一些選項,用戶和按日期排序是這樣的:

{% for user in category.verifiedUsersSortedByDate %} 

我寫了自定義的功能這裏面UserRepository.php類,並試圖將其添加到Category.php類,使其工作。不過,我得到了以下錯誤:

An exception has been thrown during the rendering of a template ("Warning: Missing argument 1 for Doctrine\ORM\EntityRepository::__construct(),

回答

3

這是乾淨多了取回您的控制器內verifiedUsersSortedByDate直接,然後傳遞到您的模板。

//... 
$verifiedUsersSortedByDate = $this->getYourManager()->getVerifiedUsersSortedByDate(); 

return $this->render(
    'Xxx:xxx.xxx.html.twig', 
    array('verifiedUsersSortedByDate' => $verifiedUsersSortedByDate) 
); 

你應該非常小心,不要在你的實體中做額外的工作。正如文檔中所引用的,「實體是保存數據的基本類」。儘可能保持實體中的工作儘可能基本,並應用entityManagers中的所有「邏輯」。

如果你不想迷失在你的代碼做,最好按照這樣的格式,在順序(從實體到Template)

1 - Entity. (Holds the data) 

2 - Entity Repositories. (Retrieve data from database, queries, etc...) 

3 - Entity Managers (Perform crucial operations where you can use some functions from your repositories as well as other services.....All the logic is in here! So that's how we can judge if an application id good or not) 

4 - Controller(takes request, return responses by most of the time rendering a template) 

5 - Template (render only!) 
+1

其實,你錯了約邏輯。實體 - 是唯一應該包含邏輯的地方。如果你想把邏輯放在控制器中,你會看到大量的重複代碼。 – Zeljko

+0

感謝您的評論@Zelijko。我從來沒有說控制器......實體只保存元數據。引用文檔「這是一個保存數據的基本類」。您需要使用實體經理來處理這些數據,並在那裏應用業務邏輯。我給你的觀點是,它的集合上的邏輯是指允許處理數據的entity + entityManager +服務。我澄清了我的答案。謝謝。 – Mick

0

你需要通過獲得用戶的控制器內庫

$em = $this->getDoctrine()->getEntityManager(); 
$verifiedusers = $em->getRepository('MYBundle:User')->getVerifiedUsers(); 

return array(
      'verifiedusers'  => $verifiedusers, 
        ); 
    }