不推荐使用SF2.6 OptionsResolverInterface和AbstractType:setDefaultOptions

时间:2014-12-01 09:57:15

标签: php symfony symfony-2.6

自" Symfony \ Component \ OptionsResolver \ OptionsResolverInterface"在SF2.6中已弃用我尝试更新我的FormTypes:

<?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仍然期望&#34; setDefaultOptions(OptionsResolverInterface $ resolver)&#34;而不是&#34; OptionsResolover&#34;

  

声明必须与FormTypeInterface-&gt; setDefaultOptions兼容(解析器:\ 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 个答案:

答案 0 :(得分:40)

版本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 */
}

答案 1 :(得分:13)

您是否考虑使用configureOptions功能,而不是setDefaultOptions

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