几个小时以来,我一直在试图解决在Doctrine 2实体对象上提交Symfony2表单的问题。
我使用自定义的ObjectManagerFlusher,在内核请求下注册为服务。
<?php
namespace CustomNamespaceCustomBundleServices;
use DoctrineORMEntityManager;
class ObjectManagerFlusher
{
/**
* @var EntityManager
*/
private $entityManager;
public function __construct(EntityManager $entityManager)
{
$this->entityManager = $entityManager;
}
public function flush()
{
if ($this->entityManager->isOpen()) {
$this->entityManager->flush();
}
}
}
简单地说,该服务应该在每个内核终止请求上对每个持久化实体进行刷新。
主要问题是,当我提交SF2表单(下面的例子)时,我会调用方法isValid来调用验证器,做所有必要的事情等等。但只有当我编辑映射到实体的现有DB记录时,问题才存在,完全新的记录会被正确验证,因为它们应该是正确的。
$form->handleRequest($request);
if ($form->isValid()) {
$this->logger->save('example log');
return true;
}
由于自定义验证组的原因,我无法对上面介绍的ObjectManagerFlusher进行验证。
所以问题是:
1) 如果有什么更好的解决方案来刷新"一次所有"实体,类似于所提出的方法,但只刷新有效的实体?
2) 如果没有更好的方法,如何解决这个问题?
非常感谢的每一次支持
如果将实体映射到表单,每次调用handleRequest时,它都会将表单的内容绑定到该实体。这是无法停止的,因为它完全是预期的功能。
处理此问题的一种方法是使用表单模型,表单模型是非数据库映射的实体,只存在于映射到表单的实体中。然后,一旦表单有效,就可以将模型中的字段复制到数据库实体中。