我遇到使用自定义属性路径定义的字段的错误映射问题。我的情况如下:
表单类型:
class MyFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add(
'aField',
TextType::class,
['property_path' => 'anObject.aProperty']
);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([ 'data_class' => FormData::class ]);
}
}
表单数据类:
class FormData
{
/**
* @var MyObject
* @Assert\Valid
*/
public $anObject;
}
表单数据嵌套对象:
class MyObject
{
/**
* @var string
* @Assert\NotBlank
*/
public $aProperty;
// NOTE: this object has other properties that are not mapped by my form and I'm not listing here for the sake of brevity.
}
我的问题如下:当aProperty
发生违规时,违规路径为data.anObject.aProperty
,因此错误不会自动映射到aField
表单字段。我从“vanilla”验证的角度理解这是正确的,但我希望在表单级别使用某种转换层来调整基于property_path
属性的映射,以便将表单错误附加到正确的字段。我尝试了error_mapping
选项,但事实并非如此。
我错误地认为这是一种“默认”行为吗?您是否认为这可能被视为一个错误,或者至少是一个值得请求的功能请求?有人与类似的情况有关并找到了解决方案吗?
答案 0 :(得分:0)
有同样的问题。调查问卷有财产$ user
用户与居住地有一个OneToMany关系。
我必须向用户的第一个问卷类型的Residency提交一些数据,所以我将property_path字段'residency'包含在第一个用户的驻留(user.residencies [0])中。在那之后,我不得不追加根形式(QuestionnaireType)的选项,并使用error_mapping来判断,驻留错误应该转到'驻留'类型('user.residencies'=>'驻留')
以防万一 - 调查问卷实体没有财产“居住”。
有我的解决方案:
<?php
class QuestionnaireType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('residency', 'residency', [
'data_class' => Residency::class,
'property_path' => "user.residencies[0]",
])
;
}
public function getName()
{
return 'questionnaire_form';
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(
array(
'data_class' => Questionnaire::class,
'cascade_validation' => true,
'error_mapping' => [
'user.residencies' => 'residency'
],
)
);
}
}