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..
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!
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 }
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..
2 ... mais utiliser Options Personnalisées au lieu de cela
3 pass Paramètres Globaux pour le constructeur (ou services)