首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用FormType闭包将Symfony 2 choice_list转换为Symfony 3

使用FormType闭包将Symfony 2 choice_list转换为Symfony 3
EN

Stack Overflow用户
提问于 2016-04-12 20:28:06
回答 2查看 590关注 0票数 1

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

代码语言:javascript
复制
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”创建,如下所示:

代码语言:javascript
复制
$formBuilder->add('myField', StaticEntityType::class, ['class' => '\Path\To\MyStaticEntity', 'function' => 'getAll'])

但是,由于choice_list选项和ObjectChoiceList不再存在,我不知道该如何做。

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

任何帮助都是欢迎的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-13 20:22:32

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

实际上,OptionResolver类允许设置规范化器,在获得选项时将在运行时调用它。

因此,我删除了choice_list选项,而不是添加choices选项,而是添加了一个规范化器:

代码语言:javascript
复制
    $resolver->setNormalizer(
        'choices',
        function (Options $options) {
            return call_user_func([$options['class'], $options['function']]);
        }
    );
票数 0
EN

Stack Overflow用户

发布于 2016-04-12 21:57:31

迁移指南所述

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

删除了choice_list选项ChoiceType

只需使用choice

因此,请尝试如下:

代码语言:javascript
复制
$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'
                    );
                }
            ]
        );

文档中的其他资源

希望能帮上忙

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36583441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档