在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)。
答案 0 :(得分:0)
我想说实体应该非常直接。不应该在那里进行任何计算,因为这个实体的角色是保持状态。
您可以创建一个特定的服务来完成所有计算,或者如果您只需要在应用程序的其他位置显示某些数据并且不使用它们,则可以创建TwigExtension。当然,您可以创建一个服务,然后将其注入TwigExtension。取决于您的需求。
答案 1 :(得分:0)
好方法是将所有业务逻辑存储在服务层中。 我更喜欢symfony应用程序的以下结构:
在您的情况下,可以有一个CalculationsService,它可以向存储库询问区域中的所有男性或女性,计算您需要的所有数据并将int作为简单的int或DTO传递回控制器。