Comment passer le paramètre au constructeur FormType à partir du controller

In Symfony2.7 j'ai été capable de passer le paramètre pour le constructeur de Type de forme directement à partir du controller tout en créant la forme, cependant dans Symfony3 Je ne suis pas capable de le faire!

avant en Symfony2.7

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

Après dans Symfony3

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

mise à Jour: Je voulais aussi y accéder à partir de:

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

Toute aide sera très appréciée..

17
demandé sur Muzafar Ali 2016-04-28 07:50:03

3 réponses

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

j'ai supprimé le paramètre de newstype constructor et ajouté des données au champ de formulaire postedBy en utilisant $options array, et passé des données à $options array du controller, veuillez cocher la case suivante:

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,
    ));
}

Controller

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

mise à jour: Veuillez utiliser le code ci-dessous si vous voulez accéder au tableau $ options à partir de la méthode addEventListener:

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

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

31
répondu Muzafar Ali 2017-11-15 09:00:12

Vous devez définir votre formulaire de 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
    }
}
#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 }
10
répondu jkucharovic 2016-04-28 06:11:16

Vous avez tous les deux raison.

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

Formulaires Symfony 101:

1 Ne pas passer Données Dynamiques pour le constructeur..

enter image description here

2 ... mais utiliser Options Personnalisées au lieu de cela

enter image description here

3 pass Paramètres Globaux pour le constructeur (ou services)

enter image description here

enter image description here

5
répondu Mick 2018-02-21 04:17:14