添加模型转换器,以嵌入的形式转换多个字段

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

我试图从2个输入字段读取\DateInterval,如下所示:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name', TextType::class, ['label' => "Name"])
        ->add('duration', DateIntervalType::class, ['label' => false])
    ;
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(['data_class' => NamedInterval::class]);
}

这是我的DateIntervalType::buildForm

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('amount', IntegerType::class)
        ->add('kind', ChoiceType::class, ['choices' => ['Year' => 'Y', 'Month' => 'M', 'Week' => 'W']])
    ;
}

这是我尝试的变压器:

$builder->get('duration')->addModelTransformer(new CallbackTransformer(
    function ($property) {
        return new \DateInterval('P' . $property['amount'] . $property['kind']);
    },
    function ($property) {
        /* compute $specString from $property assuming it's a \DateInterval */
        /* ... */
        return ['amount' => 1, 'kind' => 'W'];
    }
));

因此这不起作用,我的$property总是null在从表格数据转换为\DateInterval后验证表格并且我甚至不确定我曾经使用\DateInterval的变换器来形成数据,我做错了什么?

php symfony symfony-forms
1个回答
1
投票

似乎CallbackTransformer是倒置的:

$builder->get('duration')->addModelTransformer(new CallbackTransformer(
    function ($property) {
        /* compute specString from $property assuming it's a \DateInterval */
        /* ... */
        return ['amount' => 1, 'kind' => 'W'];
    },
    function ($property) {
        if (!$property) return null;
        return new \DateInterval('P' . $property['amount'] . $property['kind']);
    }
));

现在它就像一个魅力!

编辑:由于\DateInterval将数周转换为几天,因此在选项列表中也应该有一个选项'Day' => 'D'

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