如何在Symfony2中使持久化变得简单?

时间:2011-05-30 14:18:27

标签: php symfony persist

我目前正在玩Symfony2,到目前为止非常喜欢它。虽然出现了一个问题,但我想知道最佳做法是什么。

如果我想坚持一个实体,我必须这样:

<?php
$myEntity = new Entity();
$myEntity->setSomeData('just an example');
$em = $this->get('doctrine')->getEntityManager();
$em->persist($myEntity);
$em->flush();

这似乎是一大堆代码要一遍又一遍地完成。我更喜欢的是这样的:

<?php
$myEntity = new Entity();
$myEntity->setSomeData('just an example');
$myEntity->persist();

但是,基于我如何获得实体经理,这似乎远非最佳实践。那我该怎么办?关于你如何处理它的任何提示?

2 个答案:

答案 0 :(得分:11)

这是保持关注点正确分离的标准方法。实体不应该知道持久层。

你可以轻松做的是在你的控制器类上添加一个快捷方式persistAndFlush方法,如果你真的有那么多代码可以创建并保留新的实体。

答案 1 :(得分:6)

另外,不要忘记flush方法实际上是在更新数据库上的更改。这意味着如果您需要持久保存多个实体,最好在每次持续操作结束时执行一次刷新。

假设您有三个实体:$entity1$entity2$entity3。那么这段代码不是最优的:

$em->persist($entity1);
$em->flush();

$em->persist($entity2);
$em->flush();

$em->persist($entity3);
$em->flush();

此代码的效果会更好,因为它只会同步您的数据库一次:

$em->persist($entity1);
$em->persist($entity2);
$em->persist($entity3);

$em->flush();

因此,应谨慎使用控制器中的快捷方式,例如persistAndFlush,因为当您需要保留多个实体时效率不高。这在Doctrine2文档中指出here(页面3/4)。这里的文字来自官方2.0文档:

  

每次更改实体或每次调用persist / remove / merge /后都不要调用flush。这是一种反模式,会不必要地降低应用程序的性能。相反,形成对您的对象进行操作的工作单元,并在完成后调用flush。在提供单个HTTP请求时,通常不需要调用刷新次数超过0-2次。

此致 马特