在Symfony中对数据进行计算的位置?

时间:2017-08-02 19:53:42

标签: php symfony symfony-3.3

在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 - 接下来我将其更改为带有Joins的querybuilder)。

2 个答案:

答案 0 :(得分:0)

我想说实体应该非常直接。不应该在那里进行任何计算,因为这个实体的角色是保持状态。

您可以创建一个特定的服务来完成所有计算,或者如果您只需要在应用程序的其他位置显示某些数据并且不使用它们,则可以创建TwigExtension。当然,您可以创建一个服务,然后将其注入TwigExtension。取决于您的需求。

答案 1 :(得分:0)

好方法是将所有业务逻辑存储在服务层中。 我更喜欢symfony应用程序的以下结构:

  1. 控制器/命令只能获取用户输入,运行基本验证并将其传递给服务。
  2. 服务(有些人称他们为经理)。管理所有业务逻辑。他们对数据存储以及将使用它们的代码一无所知。为了获得数据,他们使用数据访问层,例如库。在我看来,服务输入必须是简单类型或简单的DTO。
  3. 数据访问层。该层知道数据是如何存储的,可以获取数据,将其水合成结构(例如实体)并将其传递回服务。
  4. 在您的情况下,可以有一个CalculationsService,它可以向存储库询问区域中的所有男性或女性,计算您需要的所有数据并将int作为简单的int或DTO传递回控制器。