将带有 choice_list 闭包的 Symfony2 表单类型转换为 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
不再存在,我不知道该怎么做。
文档说我们应该提供 'choices' 或 'choice_loader'。但是'choices'不接受闭包,'choice_loader'不接受表单选项列表。
欢迎任何帮助。
如migration guide所述:
The
Symfony\Component\Form\Extension\Core\ChoiceList\ObjectChoiceList
class has been removed in favor of
Symfony\Component\Form\ChoiceList\ArrayChoiceList
.
和
The choice_list
option of ChoiceType
was removed.
只需使用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'
);
}
]
);
文档中的其他 resources。
希望对您有所帮助
我想我终于找到了解决办法!
事实上,OptionResolver
class 允许设置一个 Normalizer,它将在运行时获取选项时调用。
所以我删除了 choice_list
选项,而不是添加 choices
选项,我添加了一个 Normalizer:
$resolver->setNormalizer(
'choices',
function (Options $options) {
return call_user_func([$options['class'], $options['function']]);
}
);
我将一些 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
不再存在,我不知道该怎么做。
文档说我们应该提供 'choices' 或 'choice_loader'。但是'choices'不接受闭包,'choice_loader'不接受表单选项列表。
欢迎任何帮助。
如migration guide所述:
The
Symfony\Component\Form\Extension\Core\ChoiceList\ObjectChoiceList
class has been removed in favor ofSymfony\Component\Form\ChoiceList\ArrayChoiceList
.
和
The
choice_list
option ofChoiceType
was removed.
只需使用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'
);
}
]
);
文档中的其他 resources。
希望对您有所帮助
我想我终于找到了解决办法!
事实上,OptionResolver
class 允许设置一个 Normalizer,它将在运行时获取选项时调用。
所以我删除了 choice_list
选项,而不是添加 choices
选项,我添加了一个 Normalizer:
$resolver->setNormalizer(
'choices',
function (Options $options) {
return call_user_func([$options['class'], $options['function']]);
}
);