使用 Symfony 6 表单系统编辑实体:如何调整实体加载逻辑?

问题描述 投票:0回答:1

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
实体,所以我总是得到一个新实体而不是更新旧实体。

如何提供自定义逻辑来正确加载实体?

symfony-forms
1个回答
0
投票

作为权宜之计,我手动加载机会实体,然后将其传递给

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);
....

它有效,但它部分违背了表单系统的目的。

© www.soinside.com 2019 - 2024. All rights reserved.