繁体   English   中英

将带有choice_list闭包的Symfony 2 FormType转换为Symfony 3

[英]Convert Symfony 2 FormType with choice_list closure to Symfony 3

我将一些Sf2表单类型迁移到Sf3没有任何问题......但是这个给我带来了一些麻烦。

class StaticEntityType extends AbstractType
{
    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(
            [
                'function' => 'getAll',
                'choice_label' => 'name',
                'group_by' => null,
                'choice_list' => function (Options $options) {
                    return new ObjectChoiceList(
                        call_user_func(array($options['class'], $options['function'])),
                        $options['choice_label'],
                        $options['preferred_choices'],
                        $options['group_by'],
                        'id'
                    );
                }
            ]
        );
        $resolver->setRequired('class');
        $resolver->setDefined(['function', 'choice_label', 'group_by']);
    }

    public function getParent()
    {
        return 'choice';
    }

    public function getName()
    {
        return 'static_entity';
    }
}

应该相对于选项“class”和“function”创建选项列表,如下所示:

$formBuilder->add('myField', StaticEntityType::class, ['class' => '\Path\To\MyStaticEntity', 'function' => 'getAll'])

但由于choice_list选项和ObjectChoiceList不再存在,我找不到怎么做。

Doc说我们应该提供'选择'或'choice_loader'。 但'choices'不接受闭包,'choice_loader'不接收表单选项列表。

欢迎任何帮助。

迁移指南中所述

已删除Symfony\\Component\\Form\\Extension\\Core\\ChoiceList\\ObjectChoiceList类,而使用Symfony\\Component\\Form\\ChoiceList\\ArrayChoiceList

choice_list的选项ChoiceType被删除。

只需使用choice

所以尝试如下:

$resolver->setDefaults(
            [
                'function' => 'getAll',
                'choice_label' => 'name',
                'group_by' => null,
                'choice' => function (Options $options) {
                    return new ArrayChoiceList(
                        call_user_func(array($options['class'], $options['function'])),
                        $options['choice_label'],
                        $options['preferred_choices'],
                        $options['group_by'],
                        'id'
                    );
                }
            ]
        );

doc中的其他资源

希望这有帮助

我想我终于找到了解决方案!

实际上, OptionResolver类允许设置Normalizer,在获取选项时将在运行时调用它。

所以我删除了choice_list选项,而不是添加choices选项,我添加了一个Normalizer:

    $resolver->setNormalizer(
        'choices',
        function (Options $options) {
            return call_user_func([$options['class'], $options['function']]);
        }
    );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM