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..
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!
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 }
@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.
2 ... mais utilisez Options personnalisées à la place
3 Passez Paramètres globaux au constructeur (ou aux services)