我有两个实体公司和存储具有一到一对的双向关系。实体及其关系被缓存(学说第二层缓存(。问题是,当我创建一个新的存储实体时,公司Storages Collection直到我手动清除缓存之前才有这个新实体。
AppBundleEntityMainCompany:
type: entity
table: main.company
cache:
usage: NONSTRICT_READ_WRITE
id:
id:
type: integer
nullable: false
id: true
generator:
strategy: IDENTITY
fields:
legalName:
type: string
nullable: false
length: 255
options:
fixed: false
column: legal_name
oneToMany:
storages:
targetEntity: AppBundleEntityMainStorage
mappedBy: company
cascade: ["all"]
orphanRemoval: true
cache:
usage: NONSTRICT_READ_WRITE
AppBundleEntityMainStorage:
type: entity
table: main.storage
cache:
usage: NONSTRICT_READ_WRITE
id:
id:
type: integer
nullable: false
options:
unsigned: false
id: true
generator:
strategy: IDENTITY
fields:
storageName:
type: string
nullable: true
length: 255
options:
fixed: false
column: storage_name
manyToOne:
company:
targetEntity: AppBundleEntityMainCompany
cascade: ["all"]
fetch: LAZY
mappedBy: null
inversedBy: storages
joinColumns:
company_id:
referencedColumnName: id
orphanRemoval: false
cache:
usage: NONSTRICT_READ_WRITE
这是创建存储的动作。没有什么不寻常的。
public function addAction(Request $request)
{
$form = $this->createForm(StorageAddType::class, null);
$form->handleRequest($request);
if (!$form->isSubmitted()) {
throw new RuntimeException('Некорректный запрос');
}
if (!$form->isValid()) {
throw new SymfonyComponentValidatorExceptionValidatorException((string)$form->getErrors(true));
}
$doctrine = $this->getDoctrine();
/**
* @var Storage $storage
*/
$storage = $form->getData();
$manager = $doctrine->getManager();
$manager->persist($storage);
$manager->flush();
return $this->createAjaxDataResponse($this->createSuccessMessage('Storage successfully added'));
}
只有当我尝试创建新实体(存储(时,才会观察这种行为。然后在更新/删除操作上 - storages Company 的集合已更新。
您对持久数据显然是错误的。您尝试通过管理器将未序列化的对象从形式持续到UKNOWN存储库。
尝试以下操作:
public function addAction(Request $request)
{
$form = $this->createForm(StorageAddType::class, null);
$form->handleRequest($request);
$em = $this->getDoctrine()->getManager();
if($form->isSubmitted() && $form->isValid())
{
$storage = new Storage();
$storage->setVal1($form->get('Val1'));
$storage->setVal2($form->get('Val2'));
$em->persist($storage);
$em->flush();
return $this->createAjaxDataResponse($this->createSuccessMessage('Storage successfully added'));
}
return $this->render('YOUR_TWIG_LAYOUT', [
'form' => $form->createView()
]);
}
如果通过将数据序列化为实体,则可以尝试持续整个对象。写入setValsFromForm($data)
之类的方法,并从$数据表格中序列化vars。然后更改以下行:
$storage->setVal1($form->get('Val1'));
$storage->setVal2($form->get('Val2'));
进入
$storage->setValsFromForm($form->getData());
也:异常和表单验证应通过表单类中的表单验证器来处理,而不是在控制器中。例外是当您通过控制器中的FormBuilderInterface创建表单时,但是您在此处添加逻辑,而不是外部$ form类。