web-dev-qa-db-fra.com

Comment passer un paramètre au constructeur FormType à partir du contrôleur

Dans Symfony2.7, j'ai pu passer des paramètres au constructeur de type de formulaire directement depuis le contrôleur lors de la création du formulaire, mais dans Symfony3, je ne suis pas en mesure de le faire!

Avant dans Symfony2.7

$form = $this->createForm(new NewsType("posted_by_name"));

Après dans Symfony

$form = $this->createForm(NewsType::class); // no idea how to pass parameter?

pdate: Je voulais également y accéder depuis:

$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
    // how to access posted_by_name here which is sent from controller
}

Toute aide sera grandement appréciée..

24
Muzafar Ali

Merci pour votre temps! j'ai résolu cela moi-même:

J'ai supprimé le paramètre du constructeur NewsType et ajouté des données au champ du formulaire postedBy à l'aide du tableau $ options, et transmis les données au tableau $ options du contrôleur, veuillez vérifier ce qui suit:

NewsType

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('postedBy', HiddenType::class, array(
            'data' => $options['postedBy']
            )
        )
    ;
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'postedBy' => null,
    ));
}

Contrôleur

$form = $this->createForm(NewsType::class, $news, array(
    'postedBy' => $this->getUser()->getFullname(),
);

PDATE: Veuillez utiliser le code ci-dessous si vous souhaitez accéder au tableau $ options depuis addEventListener:

$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
    $postedBy = $event->getForm()->getConfig()->getOptions()['postedBy'];
}

J'espère que ça aide quelqu'un!

45
Muzafar Ali

Vous devez définir votre formulaire en tant que service .

namespace AppBundle\Form\Type;

use App\Utility\MyCustomService;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;

class NewsType extends AbstractType
{
    private $myCustomService;

    private $myStringParameter;

    public function __construct(MyCustomService $service, $stringParameter)
    {
        $this->myCustomService   = $service;
        $this->myStringParameter = $stringParameter;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        // Your code
    }
}

Ajoutez à votre configuration de service:

#src/AppBundle/Resources/config/services.yml
services:
    app.form.type.task:
        class: AppBundle\Form\Type\NewsType
        arguments:
            - "@app.my_service"
            - "posted_by_name"
        tags:
            - { name: form.type }
11
jkucharovic

Vous avez tous les deux raison.

@Muzafar et @jkucharovic, la question est de savoir quand utiliser lequel ...

Comme Bernard Schussek le montre dans Symfony Forms 101 :

1 Ne passez pas les données dynamiques au constructeur.

enter image description here

2 ... mais utilisez Options personnalisées à la place

enter image description here

3 Passez Paramètres globaux au constructeur (ou aux services)

enter image description here

enter image description here

9
Mick