TL;DR:如何使用自定义 Doctrine 查询从 Symfony 6.3 表单系统的数据库加载实体?
加长版
我有一个简单的表单来更新
Opportunity
实体中的电话号码:
class OpportunityChangePhoneType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add("accessKey")
->add("mobilePhone")
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => Opportunity::class,
]);
}
}
这样的实体映射一个
opportunity
数据库表,如下所示:
id|access_key |mobile_phone|
--+-----------------+------------+
1|96783f217481f....|111 |
2|a967e4017f06f....|555 |
3|14697aeb49602....|333 |
如您所见,我没有在表单中公开
id
,而是使用 accessKey
。
在更新控制器上,我有:
$form = $this->createForm(OpportunityChangePhoneType::class);
$form->handleRequest($this->request);
if( $form->isSubmitted() && $form->isValid() ) {
$opportunity = $form->getData();
$this->em->getRepository(Opportunity::class)->save($opportunity, true);
}
问题是
createForm
不知道如何从access_key字段加载Opportunity
实体,所以我总是得到一个新实体而不是更新旧实体。
如何提供自定义逻辑来正确加载实体?
作为权宜之计,我手动加载机会实体,然后将其传递给
createForm()
$accessKey = $this->request->get("accessKey");
// ... check if the accessKey format is valid ...
$opportunity = $this->em->getRepository(Opportunity::class)->findOneBy(["accessKey" => $accessKey]);
// ... check if the $opportunity is valid (not expired, deleted, disabled, ...) ...
$form = $this->createForm(OpportunityChangePhoneType::class, $opportunity);
....
它有效,但它部分违背了表单系统的目的。