我有3个实体:Languages,Countrys和SetupWizard,其中包含通过languageID和countryID属性与以前的实体建立的ManyToOne关系。 我也有一个SetupWizardType,所以我可以通过以下方式构建表单:
$builder
->add('language', EntityType::class, [
'translation_domain' => 'labels',
'label' => 'label.languages',
'placeholder' => false,
'class' => Languages::class,
])
->add('country', EntityType::class, [
'translation_domain' => 'labels',
'label' => 'label.countries',
'placeholder' => false,
'class' => Countries::class
]);
如您所见,最终表单将具有2个选择字段及其选项,并且当用户从“语言”选择框中选择一个选项时,将触发一个jquery事件,该事件将提交表单并将作业传递给我的控制器:>
$entityManager = $this->getDoctrine()->getManager();
$setupWizard = $entityManager->getRepository(SetupWizard::class)->findSetup(1)
?? new SetupWizard();
$form = $this->createForm(SetupWizardType::class, $setupWizard);
$form->handleRequest($request);
$userLanguage = $form->get('language');
if ( $form->isSubmitted() ) {
$submittedData = $form->getData();
if( !empty($userLanguage->getData()) && empty($_POST['save']) ){
$setupWizard->setLanguage($userLanguage->getData());
$entityManager->persist($setupWizard);
$entityManager->flush();
return $this->redirectToRoute('wizard_index');
} elseif( $form->isValid() && !empty($_POST['save']) ) {
$entityManager->persist($submittedData);
$entityManager->flush();
return $this->redirectToRoute('app_homepage');
}
}
这是做什么的?好吧,有两种情况,在第一种情况下,选择了语言选项,因此我将其保存在db中,在下一页加载时,订户将对其进行检查并更改语言环境,以便我可以使用在第二种情况下,它检查整个表单是否已完成并且有效,以便我可以将所有值插入db中。
为什么我要这样做?我不知道一种更好的诚实方式... ajax不在讨论之中,因为我需要以所选语言呈现数据,而且这只有通过服务器端编码才有可能...我想。为此,请告诉我。
我的代码有什么问题?在第一种情况下,我只想插入语言,而不是添加所有字段...这可能是因为我使用了EntityType字段,并且当我$entityManager->persist($setupWizard);
时它保存了整个对象。只有语言价值吗?
P.S。如果您认为我的代码中的一部分可以重构为更好的代码,请告诉我,因为我是symfony / doctrine的新手,因此可以帮助我学习更多。