在Symfony中如何保存数据?
问题描述:
如果继续计算在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)。
答
我要说的是实体应该是很简单的。在那里不应该做任何计算,因为这个实体保持这个状态的角色。
您可以创建一个完成所有计算的特定服务,也可以创建一个TwigExtension,如果您只需要它们在应用程序的其他位置显示一些数据并且不使用它们。当然你可以创建一个服务,然后将它注入到TwigExtension中。取决于你的需求。
答
的好方法是存储在服务层的所有业务逻辑。 我喜欢symfony应用程序的结构如下:
- 控制器/命令只能获取用户输入,执行基本验证它,并把它传递给一个服务。
- 服务(有的叫他们经理)。管理所有业务逻辑。他们对数据存储和使用它们的代码一无所知。为了获得数据,他们使用数据访问层,例如库。服务输入,在我看来必须是简单的类型或简单的DTO。
- 数据访问层。该层知道数据如何存储,可以获取数据,将数据提供给结构(例如实体)并将其传递回服务。
就你而言,可以有一个CalculationsService,它可以询问一个存储区中的所有男人或女人,计算你需要的所有数据并将int作为简单的int或DTO传递回控制器。
一旦您在控制器中进行计算,您可以将该值传递给Twig视图,如果我正确理解您的情况,则不必将其存储在数据库中。对于简单的计算,您也可以传递数据库中的查询值并直接在Twig中进行计算。 –
您可能想考虑自定义存储库方法。 – gview