SF2.6的OptionsResolverInterface过时和AbstractType:setDefaultOptions

31

由于在SF2.6中“Symfony\Component\OptionsResolver\OptionsResolverInterface”已被弃用,我尝试更新我的表单类型:

<?php
namespace Xxx\XxxBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
/**
 * @uses Symfony\Component\Form\AbstractType
 * @uses Symfony\Component\Form\FormBuilderInterface
 * @uses Symfony\Component\OptionsResolver\OptionsResolver
 * @package Xxx\XxxBundle\Form\Type
 */
class XxxType extends AbstractType
{
    /**
     * default form builder
     *
     * @param \Symfony\Component\Form\FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('xxx', 'text') // ...
    }
    /**
     * @param \Symfony\Component\OptionsResolver\OptionsResolver $resolver
     */
    public function setDefaultOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(
            [
                'data_class' => 'xxx',
                'option1' => [],
                'option2' => 3,
                'intention' => 'xxx',
                'cascade_validation' => true
            ]
        );
    }
    /**
     * @return string
     */
    public function getName()
    {
        return 'xxx';
    }
}

问题在于AbstractType仍然期望使用"setDefaultOptions(OptionsResolverInterface $resolver)"而不是"OptionsResolover"。

声明必须与FormTypeInterface->setDefaultOptions(resolver : \Symfony\Component\OptionsResolver\OptionsResolverInterface)兼容。

这里我有什么遗漏吗?

谢谢;)


编辑

更改了我的控制器调用方式,从

$form = $this->createForm(
    new XxxType(),
    $xxxEntity,
    [
        'option1' => $array
    ]
);

$form = $this->createForm(
    new XxxType([
        'option1' => $array
    ]),
    $xxxEntity
);

并将其添加到FormType中:

protected $option1;
public function __construct($options)
{
    $this->option1 = $options['option1'];
}

现在完成了,没有添加表单选项/更改默认设置。谢谢。

2个回答

42

2.6版本 中,FormBuilder 内没有真正的替代该功能的方法。
因此,在使用2.6版本时,仍然可以使用...
然而
symfony 2.7版本 中,这个功能被

public function setDefaultOptions(OptionsResolverInterface $resolver)

已被替换为:

public function configureOptions(OptionsResolver $resolver)

为了提供降级功能,以下是正确的方法:

public function setDefaultOptions(OptionsResolverInterface $resolver) {
    /** @var OptionResolver $resolver */
    $this->configureOptions($resolver);
}

public function configureOptions(OptionsResolver $resolver) {
     /* define your defaults here */
}

3
这适用于您创建的每个类,但不适用于FormBuilders,因为它们继承自AbstractType,而Symfony需要AbstractType扩展来正确创建表单... 因此,这在FormBuilders中不起作用。 - Nickolaus
法语官方表单文档应相应更新。 - Pierre de LESPINAY
1
您的解决方案已经运作良好,但是可能有用的是需要添加以下“use”声明: use Symfony\Component\OptionsResolver\OptionsResolver;。修复方法在此处描述:https://github.com/Soullivaneuh/SonataMediaBundle/commit/c2d688eb891a0f86a375c3f9295659b21f4b91e3 - Joël Salamin

13

你是否考虑过使用configureOptions函数,而不是setDefaultOptions

protected function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
            'data_class' => 'xxx',
            'option1' => [],
            'option2' => 3,
            'intention' => 'xxx',
            'cascade_validation' => true
    ));
}

1
是的,我已经尝试过了。但是我得到了这个错误:'选项"option1"不存在。已知选项为:"action"、"allow_extra_fields"、"attr"等。' - Ferret
事实上,在Symfony的默认表单选项中,option1和options2并不存在。你是自己创建的吗? - devilcius
1
“setDefaultOptions(){$resolver->setDefaults([...])}”是我所知道的唯一一种从控制器传递额外选项/值到buidForm()的方法,因为这是文档中无处不在的解释方式。您能告诉我如何在2.6中实现吗? - Ferret
请查看:http://symfony.com/doc/current/components/options_resolver.html#usage - devilcius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接