如何在我不想直接保留的表单字段上使用Symfony数据映射器?



我正在构建一个名为EventDataMapper的Symfony数据映射器类,它需要两个TextType表单字段,并将它们转换为Doctrine存储的EventDetails对象。反过来,EventDetails对象在Event对象中被引用。(DataMapper还做其他一些事情。)我的MapFormsToData()方法的一个稍微简化的版本看起来像这样:

mapFormsToData($forms, &$data): void{

...
foreach ($forms as $element => $form) {
switch ($form->getConfig()->getName()) {
case 'title':
$this->mapTitleFormToData($form, $element, $data);
$form->getParent()->remove('title');
break;
case 'description':
$this->mapDescriptionFormToData($form, $element, $data);
$form->getParent()->remove('description');
break;
}
}
$this->mapTitleAndDescriptionFieldsToEventDetailsData($data, $forms);
}

…我的EventFormType的buildForm()方法的一个稍微简化的版本看起来像这样:

public function buildForm(FormBuilderInterface $builder, array $options): void
{
...
$builder
->add('title', TextType::class)
->add('description', TextareaType::class)
->setDataMapper(new EventDataMapper)
;
}

当我提交我的表单,然而,我得到一个NoSuchPropertyException声明如下:

无法确定属性"title"的访问类型;在课堂上AppBundleEntityEvent":属性"title"没有一个方法"addTitle()"/"removeTitle()";setTitle()";"__set()";或"__call()";在类中存在并具有公共访问权限"实体AppBundle Event". .

正如您所看到的,我已经尝试使用remove()方法将表单字段从表单中取出,以避免此异常。然而,这并不奇怪,因为表单列表是按值传递的,而不是按引用传递的。(将函数更改为通过引用传递会导致FatalError作为方法签名,然后不再匹配Symfony的DataMapperInterface。)

由于我不会进入这里的原因,我不能使用一个新的表单类型来处理EventDetails,所以EventDetailsFormType不是一个选项。我必须用我的EventFormType类和EventDataMapper类来做这件事,而且只能用那些类。类似地,我必须保留这两个TextType字段,并使用它们当前的名称,以便不干扰我的团队中的其他成员的工作。

是否有一个简单的方法来修复这些约束?

找到了!

我只需要将['mapped' => false]添加到表单字段定义:

->add('title', TextType::class, ['mapped' => false])
->add('description', TextareaType::class, ['mapped' => false])

很简单。

相关内容

  • 没有找到相关文章

最新更新