Php 将带有选项列表闭包的Symfony 2 FormType转换为Symfony 3

Php 将带有选项列表闭包的Symfony 2 FormType转换为Symfony 3,php,symfony,symfony-forms,Php,Symfony,Symfony Forms,我将一些Sf2表单类型迁移到Sf3没有任何问题。。。但是这个给我带来了一些麻烦 class StaticEntityType extends AbstractType { /** * @param OptionsResolver $resolver */ public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults(

我将一些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';
    }
}
选项列表应相对于选项“类”和“函数”创建,如下所示:

$formBuilder->add('myField', StaticEntityType::class, ['class' => '\Path\To\MyStaticEntity', 'function' => 'getAll'])
但是由于
choice\u list
选项和
ObjectChoiceList
不再存在,我不知道该怎么办

医生说我们应该提供“选择”或“选择加载器”。但是“选项”不接受闭包,“选项加载器”不接收表单选项列表

欢迎提供任何帮助。

如中所述:

Symfony\Component\Form\Extension\Core\ChoiceList\ObjectChoiceList
类已被删除,以支持
Symfony\Component\Form\ChoiceList\ArrayChoiceList

已删除
ChoiceType
choice\u列表
选项

只需使用
选项

因此,请尝试以下方法:

$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'
                    );
                }
            ]
        );
其他的在这里


希望这对我有所帮助

我想我终于找到了解决办法

事实上,
OptionResolver
类允许设置一个规范化器,当获取选项时,将在运行时调用该规范化器

因此,我删除了
choice\u列表
选项,并没有添加
choices
选项,而是添加了一个规范化器:

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

谢谢你的回复。但是
选项
选项不存在。也许你提到了
选项
选项,但正如我所说的,它不接受闭包。(此外,ArrayChoiceList构造函数仅接受2个参数)