web-dev-qa-db-ja.com

SF2.6 OptionsResolverInterfaceの廃止およびAbstractType:setDefaultOptions

「Symfony\Component\OptionsResolver\OptionsResolverInterface」はSF2.6で廃止されたので、FormTypeを更新しようとしました:

<?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 がまだ "OptionsResolover"ではなく "setDefaultOptions(OptionsResolverInterface $ resolver)"を期待していることです。

宣言は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'];
}

フォームオプションを追加したり、デフォルトを変更したりせずにそれを行いましたありがとう

30
Ferret

バージョン2.6では、FormBuilder内でこの関数を実際に置き換えるものはありません。
したがって、バージョン2.6を使用している場合。それはまだ使用できます...
ただし
In 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 */
}
40
Nickolaus

configureOptionsの代わりにsetDefaultOptions関数の使用を検討しましたか?

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