2017-08-02 94 views
-2

如果繼續計算在Symfony的數據?在Symfony中如何保存數據?

比如我有實體:

City: 
- name (string) 
- men (int) 
- women (int) 
- streets (Collection) 

public function getMenAndWomenIn33rd() 
{ 
    $count = 0; 
    foreach ($this->getDistricts() as $district) { 
     if ($district == '33rd') $count++; 
    } 
    return $this->getMen() + $this->getWomen() + $count; 
} 

Streets: 
- city_id (relation) 
- name 
- district 

而且比如我想算的男性和女性的平均數量在街道某小區33和它傳遞給模板。

public function indexAction() 
{ 
    $em = $this->getDoctrine()->getManager(); 
    $city = $em->getRepository('AppBundle:City')->findOneByName('New York'); 

    return $this->render('city/index.html.twig', array('name' => $city)) 
} 

模板:

{% block body %} 
    City: {{ city.name }} 
    //others data... 
    33rd: {{ city.getMenAndWomenIn33rd() }} 

{% endblock %} 

方法getMenAndWomenIn33rd()應在City entity?也許在存儲庫?在存儲庫中應該對數據庫進行操作?也許在服務?我知道它不能在控制器上,因爲控制器應該只傳遞數據。

我知道 - 我可以在GROUP BY庫做到這一點,但我寧願只有一個查詢(findOneBy - 接下來我將其更改爲與加入的QueryBuilder)。

+0

一旦您在控制器中進行計算,您可以將該值傳遞給Twig視圖,如果我正確理解您的情況,則不必將其存儲在數據庫中。對於簡單的計算,您也可以傳遞數據庫中的查詢值並直接在Twig中進行計算。 –

+0

您可能想考慮自定義存儲庫方法。 – gview

回答

0

我要說的是實體應該是很簡單的。在那裏不應該做任何計算,因爲這個實體保持這個狀態的角色。

您可以創建一個完成所有計算的特定服務,也可以創建一個TwigExtension,如果您只需要它們在應用程序的其他位置顯示一些數據並且不使用它們。當然你可以創建一個服務,然後將它注入到TwigExtension中。取決於你的需求。

0

的好方法是存儲在服務層的所有業務邏輯。 我喜歡symfony應用程序的結構如下:

  1. 控制器/命令只能獲取用戶輸入,執行基本驗證它,並把它傳遞給一個服務。
  2. 服務(有的叫他們經理)。管理所有業務邏輯。他們對數據存儲和使用它們的代碼一無所知。爲了獲得數據,他們使用數據訪問層,例如庫。服務輸入,在我看來必須是簡單的類型或簡單的DTO。
  3. 數據訪問層。該層知道數據如何存儲,可以獲取數據,將數據提供給結構(例如實體)並將其傳遞迴服務。

就你而言,可以有一個CalculationsService,它可以詢問一個存儲區中的所有男人或女人,計算你需要的所有數據並將int作爲簡單的int或DTO傳遞迴控制器。