问题描述
|
我目前正在玩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();
但是,根据我如何获得实体经理的经验,这似乎并不是最佳实践。那我该怎么办?关于如何处理的任何提示?
解决方法
这是保持适当的关注点分离的标准方法。实体不应该知道持久层。
如果您确实拥有创建和持久化新实体的代码,那么可以轻松地在控制器类上添加一个快捷方式persistAndFlush方法。
, 另外,不要忘记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();
因此,应谨慎使用控制器中的快捷键(例如ѭ7),因为在需要保留多个实体时效率不高。这在“ Doctrine2”文档中有所说明(在第3/4页)。这里的文字摘自官方2.0文档:
在对实体进行的每次更改或对persist / remove / merge / ...的每次单次调用之后,都不要调用flush。这是一种反模式,不必要地降低了应用程序的性能。取而代之的是,对对象进行操作的表单工作单元,并在完成后调用冲洗。在处理单个HTTP请求时,通常不应调用刷新次数超过0-2次。
问候,
马特