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

Fer*_*ret 30 php symfony symfony-2.6

由于在SF2.6中不推荐使用"Symfony\Component\OptionsResolver\OptionsResolverInterface",我试图更新我的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';
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是AbstractType仍然需要"setDefaultOptions(OptionsResolverInterface $ resolver)"而不是"OptionsResolover"

声明必须与FormTypeInterface-> setDefaultOptions兼容(解析器:\ Symfony\Component\OptionsResolver\OptionsResolverInterface)

这里有什么遗失吗?

谢谢 ;)


编辑

改变了我的控制器呼叫

$form = $this->createForm(
    new XxxType(),
    $xxxEntity,
    [
        'option1' => $array
    ]
);
Run Code Online (Sandbox Code Playgroud)

$form = $this->createForm(
    new XxxType([
        'option1' => $array
    ]),
    $xxxEntity
);
Run Code Online (Sandbox Code Playgroud)

并将其添加到FormType:

protected $option1;
public function __construct($options)
{
    $this->option1 = $options['option1'];
}
Run Code Online (Sandbox Code Playgroud)

做了它,没有添加表单选项/现在更改默认值.谢谢

Nic*_*aus 40

2.6版本中,FormBuilder中没有真正的替代函数
.因此,如果使用2.6版本.它仍然可以使用...
但是
symfony版本2.7中的功能

public function setDefaultOptions(OptionsResolverInterface $resolver)
Run Code Online (Sandbox Code Playgroud)

已被替换为:

public function configureOptions(OptionsResolver $resolver)
Run Code Online (Sandbox Code Playgroud)

为了提供降级功能,这是要走的路:

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

public function configureOptions(OptionsResolver $resolver) {
     /* define your defaults here */
}
Run Code Online (Sandbox Code Playgroud)

  • 这适用于您将创建但不适用于formbuilders的每个类,因为它们继承自AbstractType,并且symfony需要AbstractType扩展来正确创建表单...因此这在FormBuilders中不起作用 (3认同)

dev*_*ius 13

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

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