type theme isvalid form_row form symfony-forms symfony

symfony-forms - theme - symfony form_row



Cómo pasar el parámetro al constructor FormType desde el controlador (2)

¡Gracias por tu tiempo! Lo resolví yo mismo:

Quité el parámetro del constructor NewsType y agregué los datos al campo de formulario postedBy usando $ array de opciones, y pasé los datos a la matriz $ options desde el controlador, por favor verifique lo siguiente:

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

Controlador

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

ACTUALIZACIÓN: utilice el código siguiente si desea acceder a $ options array desde addEventListener:

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

Espero que ayude a alguien!

En Symfony2.7 pude pasar el parámetro al constructor de tipo de formulario directamente desde el controlador al crear el formulario, sin embargo, en Symfony3 no puedo hacerlo.

Antes en Symfony2.7

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

Después en Symfony3

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

Actualización: también quería acceder desde:

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

Cualquier ayuda será muy apreciada ...


Debes definir tu forma como servicio .

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 } }

Agregue a su configuración de servicio:

#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 }