web-dev-qa-db-fra.com

SF2.6 OptionsResolverInterface déconseillé et AbstractType: setDefaultOptions

comme "Symfony\Component\OptionsResolver\OptionsResolverInterface" est déconseillé dans SF2.6, j'ai essayé de mettre à jour mes 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';
    }
}

Le problème est que AbstractType attend toujours "setDefaultOptions (OptionsResolverInterface $ resolver)" au lieu de "OptionsResolover"

La déclaration doit être compatible avec FormTypeInterface-> setDefaultOptions (résolveur:\Symfony\Component\OptionsResolver\OptionsResolverInterface)

Y a-t-il quelque chose qui me manque ici?

Merci ;)


[~ # ~] modifier [~ # ~]

A changé mon appel de contrôleur de

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

à

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

et en ajoutant ceci au FormType:

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

l'a fait, sans ajouter d'options de formulaire/modifier les valeurs par défaut maintenant. Merci

30
Ferret

Dans version 2.6 il n'y a pas de véritable remplacement pour cette fonction dans FormBuilder
Par conséquent, si vous utilisez la version 2.6. il peut encore être utilisé ...
cependant
Dans symfony version 2.7 la fonction

public function setDefaultOptions(OptionsResolverInterface $resolver)

a été remplacé par:

public function configureOptions(OptionsResolver $resolver)

afin de fournir fonctionnalité de rétrogradation c'est la voie à suivre:

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

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

Avez-vous envisagé d'utiliser la fonction configureOptions, au lieu de setDefaultOptions:

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